关于c ++内存管理的问题

时间:2010-04-29 19:39:41

标签: c++ memory-management

而不是

int *i = new int;
...
delete i;
我可以这样做吗?

int i;
...
delete &i;

9 个答案:

答案 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()分配的指向内存的指针,则程序可能会崩溃。

另外,请务必了解deletedelete []之间的区别。

更不用说没有必要删除局部变量了。它在堆栈上分配,并在超出范围时自动销毁(例如,当函数返回时)。

答案 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;