C++ 删除c+中的字符串对象+;
我有一个const char*str,我想把它转换成一个简单的字符串,所以我使用std::string()构造函数并将str的值复制到我的变量中C++ 删除c+中的字符串对象+;,c++,string,C++,String,我有一个const char*str,我想把它转换成一个简单的字符串,所以我使用std::string()构造函数并将str的值复制到我的变量中 const char* str; std::string newStr = std::string(str); <some processing>... <end> const char*str; std::string newStr=std::string(str); ... 因此,在函数
const char* str;
std::string newStr = std::string(str);
<some processing>...
<end>
const char*str;
std::string newStr=std::string(str);
...
因此,在函数结束之前,我必须删除字符串newStr,否则std::string类的析构函数将被自动调用,并且此newStr将被删除。当我读到std::string类的析构函数不是虚拟的时,我感到困惑。但是它说字符串将在超出范围时被删除。如果析构函数不是虚拟的,为什么字符串变量在超出范围后会被删除呢 您不必删除
newStr
。它有,所以当它超出范围时,将调用它的析构函数。这与析构函数是虚拟的完全无关。您不必删除newStr
。它有,所以当它超出范围时,将调用它的析构函数。这与析构函数是虚拟的完全无关。因为您没有使用new关键字创建对象,所以对象在堆栈上创建,析构函数在变量超出范围时自动调用。但是,当您使用new关键字创建对象时,对象是在堆上创建的。
这是C++中的一般规则。p> 由于没有使用new关键字创建对象,因此在堆栈上创建该对象,并在变量超出范围时自动调用析构函数。但是,当您使用new关键字创建对象时,对象是在堆上创建的。
这是C++中的一般规则。p> 您是否
new
it?如果没有,那么就不需要delete
。您似乎对delete
的作用以及析构函数(通常)应该是虚拟的原因有一些误解。简单的规则是:每个新的只删除一个,每个新的[]
只删除一个delete[]
。你没有一个新的
,所以你不需要一个删除
<代码>标准::字符串newStr(str)代码>给定的代码存在问题,与OP的问题无关。由于str
未初始化,newStr
的值将未定义。您是否新建了它?如果没有,那么就不需要delete
。您似乎对delete
的作用以及析构函数(通常)应该是虚拟的原因有一些误解。简单的规则是:每个新的只删除一个,每个新的[]
只删除一个delete[]
。你没有一个新的
,所以你不需要一个删除
<代码>标准::字符串newStr(str)代码>给定的代码存在问题,与OP的问题无关。由于str
未初始化,因此newStr
的值将未定义。谢谢,我得到了它。因为我没有使用new创建对象,所以它是一个自动变量,在超出范围后会被销毁。谢谢,谢谢,我明白了。因为我没有使用new创建对象,所以它是一个自动变量,在超出范围后会被销毁。谢谢