int* func()
{
int* i=new int[1];
//do something
return i;
}
void funcc()
{
int* tmp=func();
//delete allocated memory after use
delete tmp;
}
应该删除第二个功能中描述的工作是否正确使用? 我想我没有为新分配内存?肯定是第一次使用new。
答案 0 :(得分:7)
它应该是delete [] tmp;
,因为你正在做数组新的,但是否则,它是正确的。
答案 1 :(得分:3)
这是Undefined Behavior™。如果您使用delete
,则仅可以使用new
。如果您使用new[]
,则必须delete[]
。更重要的是,这是一个非常不安全的代码 - 你需要一个智能指针。
答案 2 :(得分:3)
没有。 new T[]
应与delete []t
匹配。 new T
应与delete t
匹配。否则,您的代码将调用未定义的bevavior。
如果你在函数之外做delete []tmp
并不重要。可以这样做。所有你需要记住删除的表单。
答案 3 :(得分:3)
我的蜘蛛侠意识告诉我,您想知道在int
中创建的动态分配的func
是否与您在delete
中尝试的funcc
相同delete[]
。
答案是:是的。虽然您不使用严格相同的指针变量,但两个指针都指向同一对象。
但,请在使用[]
时使用new[]
(使用[]
)(new
) 。在您修复此问题之前,您的代码已被破坏。
另外,尽量避免delete
在一个地方,std::vector
在另一个地方。{{1}}。或许可以考虑使用{{1}},而不是容易出错。
答案 4 :(得分:3)
正如其他人所说,您应该使用delete[]
删除数组,而不是delete
。
但是,如果您问是否可以删除tmp
,因为它指向的内存未分配new
,那么您的前提是不正确的。
分配了new
。您在i
函数中分配的内存地址将被传回存储在tmp
中,因此 指向由{{1}分配的内存}}
你是正确的new
本身超出了范围,但i
分配的内存在退出函数时仍然存在范围变化。而且,由于您将其位置存储到new
,因此您仍然可以访问它。
因此删除(一旦你使用tmp
删除数组)是完全有效的。