而不是
int *i = new int;
...
delete i;
我可以这样做吗?
int i;
...
delete &i;
答案 0 :(得分:10)
你不想这样做。当代码超出范围时,将清除在堆栈上声明的int。
答案 1 :(得分:5)
只是做:
int i;
i = 5 + 5;
答案 2 :(得分:4)
如果在堆栈上声明一个变量,它的析构函数将被调用,并且当它超出范围时回收内存。
如果从堆中分配空间,则必须明确释放该空间。
你不能混合这两种策略。
答案 3 :(得分:2)
简答:没有
答案很长:
int i;
在堆栈上声明一个int。当int超出范围时,将删除此int。
int *i = new int;
在堆栈上声明一个int指针,然后在堆上创建一个int(new)并将堆值的地址分配给堆栈值。同样,int指针在超出范围时被删除,但堆值仍然存在,除非它被删除。
答案 4 :(得分:2)
如果您在堆上需要它们,则应该只动态分配变量。
使用其他语言(例如java)编程的人的常见误解(或习惯)是使用new
运算符来创建每个变量。这不是必需的,可能会导致代码碎片化。
在C ++中,对于小变量,只需声明它们:
int i;
而不是:
int * i = new int;
通过不使用new
运算符声明它们,您允许编译器在必要时自动处理它们(a.k.a。在离开范围时)。这节省了程序员分配和释放的负担。
答案 5 :(得分:2)
没有。事实上,不!您只能使用delete
释放由new
分配的内存。如果在指向本地变量的指针上调用delete
,或者在malloc()
分配的指向内存的指针,则程序可能会崩溃。
另外,请务必了解delete
和delete []
之间的区别。
更不用说没有必要删除局部变量了。它在堆栈上分配,并在超出范围时自动销毁(例如,当函数返回时)。
答案 6 :(得分:0)
只做
int i;
在代码块的右括号之后,声明了整数,它将从堆栈中删除。
答案 7 :(得分:0)
如果要在堆栈上分配它,请执行以下操作:
int i;
i=5;
当堆栈超出范围时(例如,当你退出函数时),将删除int。
如果要在堆上分配它,请执行以下操作:
int* i = new int;
*i = 5;
delete i;
这将为您创建指向堆上的int的指针。当你不再需要它时删除它。
答案 8 :(得分:-1)
不要这样做
int i;
...
delete &i;
但是如果你真的必须在堆上分配一个int并且你绝对希望你的变量看起来像普通的int变量,你可以试试这个:
int &i = *(new int);
...
delete &i;