如果我使用这样的CString:
void myFunc(char *str)
{
CString s(str);
// Manipulate other data with CString
// ...
// Finished
// Should I somehow delete 's' here to avoid a memory leak?
}
一旦函数超出范围,字符串是否被删除?
另外,我知道new
关键字分配内存,如果我构造一个没有new
关键字的对象,是否仍然分配了内存?我的直觉告诉我是的,但我想验证。
e.g。
CString *asdf = new CString("ASDF");
// same as?
CString asdf("ASDF");
答案 0 :(得分:14)
new
在堆上分配内存,所以
CString *asdf = new CString("ASDF");
在堆上分配CString
并将指针指向asdf
。在调用asdf
之前,不会释放delete asdf
的析构函数。
没有new
,您在堆栈上进行分配,所以
CString asdf("ASDF");
分配asdf
代表的堆栈内存。当堆栈被展开时(例如从函数返回时),将自动回收此内存,并且当asdf
超出范围时,会自动调用析构函数。
此外,CString
清理自己的资源,因此如果CString
对象被清除(如果它在堆栈上则超出范围,或者如果它在堆上则被删除),资源它的用途也会被清理干净。
答案 1 :(得分:1)
CString
管理字符串字符本身的内存,因此它会在其析构函数中释放这些内存(它有点聪明,但可以这样想)。
如果您使用CString
分配new
并且永远不会在其上调用delete
,那么您不仅会泄漏CString
对象的内存,而且它的析构函数也永远不会调用所以你也为字符串字符泄漏了内存。
答案 2 :(得分:1)
在大多数情况下创建CString对象时,最终会有两个分配,一个用于对象本身,另一个用于字符串的字符。字符分配隐藏在对象中,您不必担心它。如果您在第一个示例中将对象声明为自动变量,则该对象将在块的末尾(即右括号)处取消分配。如果您使用new
进行分配,则必须稍后delete
,否则会出现内存泄漏。
答案 3 :(得分:0)
如果在堆栈上分配一个对象(即如果你不使用new),那么当它超出函数末尾的范围时,它将被自动销毁。