C++ 中的运算符“new”和“delete”

问题描述 投票:0回答:1

我遇到了一个问题,来自 Bjarne Stroustrup 的书编程:使用 C++ 的原理和实践(第 2 版)中的练习,位于第 17 章练习部分的最后,练习 7:

如果不使用

delete linearray1;
,程序可以正常工作。 因此,问题出在删除分配的动态内存时。

控制台中没有错误消息或警告。 然而,VS Code 向我展示了这一行中的问题 (

delete linearray1
)。 以黄色突出显示整条线。

请告诉我如何解决这种情况下的问题。如何正确清除分配的内存?

#include <iostream> 

void fillarray(std::string& array)
{ 
    char* linearray1 {new char};
    char* line = linearray1;
    std::cin >> line;
    
    while (*line)
    {   
        if (*line == '!')
            break;
        array += *line;
        line++;
    }
    delete linearray1;
}

int main()
{

    std::string linearray1;
    fillarray(linearray1);
    std::cout << "\n" << linearray1;
    return 0;
}
c++ memory malloc new-operator
1个回答
0
投票

总结评论...

fillarray()
仅为 1
char
分配动态内存,然后将该指针传递给采用
operator>>
指针的
char*
重载。 然后,该重载将尝试读取并输出 more 多于 1 个
char
(包括
'\0'
终止符),直到遇到结束输入的空白字符。 因此,您最终会通过超出动态内存的范围来调用“未定义的行为”,从而破坏周围的内存。在这种情况下,delete 只是该行为的不知情受害者。
如果您确实想一次读取输入 1 

char

,请使用读取单个

operator>>
char
重载,或使用
istream::get(char&)
方法,例如:
void fillarray(std::string& array)
{ 
    char* pch {new char};
    
    while ((std::cin >> *pch) && (*pch != '!'))
    // or: while (std::cin.get(*pch) && (*pch != '!'))
    {   
        array += *pch;
    }

    delete pch;
}

但是,不需要自己动态分配 1 
char

,只需使用本地

char
变量即可,例如:
void fillarray(std::string& array)
{ 
    char ch;
    
    while ((std::cin >> ch) && (ch != '!'))
    // or: while (std::cin.get(ch) && (ch != '!'))
    {   
        array += ch;
    }
}

但是,在这种特殊情况下,您可以使用 
std::string

直接读取目标

std::getline()
,例如:
void fillarray(std::string& array)
{ 
    std::getline(std::cin, array, '!');
}

	
© www.soinside.com 2019 - 2024. All rights reserved.