C++ 删除范围外的变量

C++ 删除范围外的变量,c++,C++,第二个函数中描述的删除工作是否正确使用? 我想我没有通过new为它分配内存?可以肯定的是,第一次使用了new。这是未定义的行为™. 如果使用了new,则只能使用delete。如果使用了new[],则必须删除[]它。除此之外,这是非常不安全的代码-您需要一个智能指针。它应该是delete[]tmp因为您正在执行数组新建,但在其他方面,它是正确的 否。新T[]应匹配删除[]T。和新T应匹配删除T。否则,您的代码将调用未定义的bevavior 如果在函数之外执行delete[]tmp,则无所谓。这样做

第二个函数中描述的删除工作是否正确使用?
我想我没有通过new为它分配内存?可以肯定的是,第一次使用了new。

这是未定义的行为™. 如果使用了
new
,则只能使用
delete
。如果使用了
new[]
,则必须
删除[]
它。除此之外,这是非常不安全的代码-您需要一个智能指针。

它应该是
delete[]tmp因为您正在执行数组新建,但在其他方面,它是正确的

否。
新T[]
应匹配
删除[]T
。和
新T
应匹配
删除T
。否则,您的代码将调用未定义的bevavior

如果在函数之外执行
delete[]tmp
,则无所谓。这样做是可以的。您需要记住的是删除的形式。

  • 我的蜘蛛感觉告诉我,您想知道您在
    func
    中创建的动态分配的
    int
    是否与您在
    func
    中尝试删除的
    相同

    答案是:是的。虽然没有严格地使用相同的指针变量,但两个指针都指向同一个对象

  • 但是,当您使用
    new[]
    (使用
    []
    )时,请记住使用
    delete[]
    )。在修复此问题之前,您的代码已损坏



另外,尽量避免在一个位置出现
new
ing,在另一个位置出现
delete
ing。可能会考虑一个<代码> STD::向量,这远远不易出错。

正如其他人所陈述的,你应该使用<代码> Dele[[]/Cord]来删除数组,而不是<代码>删除< /代码> .< 但是,如果您询问是否可以删除

tmp
,因为它指向的内存没有分配
new
,那么您的前提是不正确的

它被分配了
new
。在函数中为
i
分配的内存地址被传回存储在
tmp
中,因此它确实指向由
new
分配的内存

您是正确的,
i
本身在该点超出作用域,但是
new
分配的内存在退出函数时仍保留作用域更改。而且,由于您正在将其位置存储到
tmp
,因此您仍然可以访问它


因此,删除操作(一旦使用
[]
将其作为数组删除)是非常有效的。

的确如此。你回答的第一部分指出了一个重大缺陷;我相信第二部分解决了OP实际存在的问题。感谢Tomalak和RussellA smart pointer提供了一个动态分配数组?拉另一个!矢量化或污名化。好的,谢谢,我投票支持你,请参阅纳瓦兹评论部分的下一个问题。@Tomalak:
unique\u ptr
具有
T[]
专门化@海豚宝宝:如果你还有其他问题,请发另一个问题。谢谢,我错了,应该是
delete[]tmp
。但是删除一个我没有分配内存的临时文件应该是正确的吗?我认为新的删除对应该应用于同一个定义的变量。非常感谢,这是有意义的,因为它仍然指向上一个变量,所以绝对允许重复使用不同的变量:-D@Tomalak,这可能是韩寒希望看到的更详细的内容,但我已经调整了文本以澄清。帕西迪亚布洛:尽管如此,任何人都不希望教授曲解;)
int* func()
{
   int* i=new int[1];
   //do something
   return i; 
}

void funcc()
{
   int* tmp=func();
   //delete allocated memory after use
   delete tmp;
}