如果我创建2个指针:
int *pointer;
int *temp;
我为其中一个人分配了内存temp
:
temp = new int [ size ]; //size = 6
然后我将第二个指针pointer
指向同一个内存位置:
pointer = temp;
如果我想释放temp:
delete [ ] temp;
它不会让我...而且我说它不会让我,因为如果我做一个循环来填充temp
的元素,即使我使用delete [ ] temp;
之后它仍然会让我填充它。我想了解这里发生了什么,所以现在我的问题是:
delete [ ] temp;
时释放的内存(我想不是因为我有另一个指向该位置的指针),如果不是......这是否意味着delete [ ] temp;
没有效果?< / LI>
delete [ ] pointers;
,因为我从未为指针分配内存,只是将其指向temp
内存地址。注意:我知道我可以使用向量,我只是在使用指针时试图理解内存管理。
答案 0 :(得分:4)
当我做
delete [ ] temp;
时释放内存
当然是! delete
运算符是非常听话的,它假设如果你要求它删除一块内存,那么你就完成了那个块。
我认为不是因为我有另一个指向该位置的指针
您在delete []
上调用temp
时,其他指针变为悬空。取消引用它是undefined behavior,这意味着您的程序无效,即使它编译甚至运行完成而没有崩溃。
如果多个指针指向该内存位置,是否可以释放内存?
是的,实际上就是发生了什么。
让我们说我完成了两个指针,我想释放内存,最好的方法是什么?
使用智能指针,例如std::shared_ptr<T>
。这样可以避免完全调用delete
。
答案 1 :(得分:1)
是的,是的。删除后使用内存导致undefined behavior,即任何事情都可能发生,包括但不限于:代码编译,代码崩溃,代码按预期运行,......当我做
delete [ ] temp;
时释放内存
如果我执行循环来填充
,我仍会让我填充它temp
的元素,即使我使用delete [ ] temp;
C ++没有机制来阻止使用后删除。如果您正在执行此操作,那么您只是调用未定义的行为。
如果多个指针指向该内存位置,是否可以释放内存?
是。再说一遍,C ++中什么也没有阻止程序员这样做。您必须确保您的代码不是双重删除任何内容或访问已经解除分配的任何内容。
我无法做
delete [ ] pointers;
,因为我从未为指针分配内存,只是将其指向临时内存地址。
你也可以通过pointer
删除内存。任何指向已分配内存且与用于分配内存的类型相同的指针都可用于删除它。
最后,按照dasblinkenlight所说:避免使用高级手动内存处理,例如new
和delete
,而不是智能指针。他们将在适当的时间自动释放你的记忆1)和2)只有一次。之后,他们将自己重置为nullptr
,使得删除后使用容易发现。