删除超出范围的变量
delete a variable out of scope
int* func()
{
int* i=new int[1];
//do something
return i;
}
void funcc()
{
int* tmp=func();
//delete allocated memory after use
delete tmp;
}
删除第二个函数中所述的工作应该是正确的用法吗?我想我没有通过新的为它分配内存?可以肯定的是,第一个使用了新
应该是delete [] tmp;
的,因为你正在做数组新,但除此之外,它是正确的。
正如其他人所说,您应该使用 delete[]
来删除数组,而不是delete
。
但是,如果您询问是否可以删除tmp
,因为它指向的内存未分配new
,那么您的前提是不正确的。
它被分配了new
.您在函数中为i
分配的内存地址被传回以存储在tmp
中,因此它确实指向由new
分配的内存。
您是对的,此时i
本身超出了范围,但new
分配的内存在退出函数时在范围更改中幸存下来。而且,由于您将其位置存储到 tmp
中,您仍然可以访问它。
因此,删除(一旦你用[]
将其作为数组删除(是非常有效的。
未定义的行为™。仅当您使用 new
时,才能使用delete
。如果您使用了new[]
,则必须delete[]
它。更重要的是,这是非常不安全的代码 - 你需要一个智能指针。
No. new T[]
应该匹配delete []t
.new T
应该匹配delete t
.否则,您的代码将调用未定义的 bevavior。
如果你在函数之外做delete []tmp
也没关系。这样做是可以的。您需要记住的所有内容是删除的形式。
我的间谍感官告诉我,你想知道你在
func
中创建的动态分配int
是否与你试图在funcc
中delete
的相同。答案是:是的。尽管不使用严格相同的指针变量,但两个指针都指向同一对象。
但是,请记住在使用
new[]
(带[]
(时使用delete[]
(带[]
(。在修复此问题之前,您的代码已损坏。
另外,尽量避免在一个地方new
,在另一个地方delete
。也许可以考虑使用std::vector
,这更不容易出错。
- 在 c++ 中确定堆栈上的变量范围
- C++中静态方法的局部变量范围
- 功能原型变量范围C
- C 公共变量范围混乱
- 指向本地变量的指针存储在此变量范围之外
- C 变量范围
- 在函数的参数列表中初始初始化的变量范围
- 由于变量范围导致的段故障
- 友元运算符中的变量范围
- CMake <PROJECT-NAME>_SOURCE_DIR 变量范围
- switch 语句中的奇数变量范围
- C++ try 中的变量范围
- C++ 引用变量范围问题
- 更改静态变量范围
- C++向量、常量字符*、变量范围和生存期
- 对变量范围感到困惑 - 析构函数意外调用
- 限制变量范围的利弊
- 我的C++变量(范围相关)有什么问题?
- c++中变量范围嵌套不当
- Qt5、lambda和变量范围