这样使用“delete”会释放原先分配的内存吗?

3
class A {
    struct structA;
}

其他地方:

structA* structAPointer = new structA;

一片遥远的土地:
void Wonderland::rabbitHole(structA* structAPointer) {
    delete structAPointer;
}

delete运算符是否会释放在“其他地方”分配的原始内存?


8
如果使用原始的structAPointer来调用rabbitHole,则是这样的。 - Shoe
@Jeffrey 那不应该通过引用传递指针才能发生吗? - David G
@0x499602D2,不完全是这样。delete运算符释放的是内存地址,而不是保存它的变量。 - Shoe
2个回答

6
无论代码的哪个部分进行了分配,delete都会删除由new创建的任何东西。
而delete []则是用于由new []创建的内容。
通常,您希望创建该内容的部分负责删除它,以便更轻松地管理内存。

0

delete 操作符是否会释放在“其他地方”分配的原始内存?

是的,如果 原始的 structAPointer 从未被修改并且正在传递给 rabbitHole

delete 操作符作用于持有指针的变量的值(地址),因此您可以使用 rabbitHole 在任何您动态分配的 structA* 上。

话虽如此,C++社区强烈不建议使用 newdelete(或者说 new[]delete[])。有很多替代方法来处理动态分配的内存,这些方法已被证明比手动处理指针更好。例如,std 库提供了非常好的一组工具,可帮助您管理动态内存而无需自己处理指针的缺点。


你能给我展示一个人们通常如何做事的例子吗?我只是把编程当作一种业余爱好,不太了解管理内存的“标准”方法。 - Hobbyist
@Hobbyist,std库提供了多种类型的智能指针。它们的使用取决于应用程序的上下文。我在答案中提供了维基百科链接以简要解释其中的区别。如需了解更多,请查看cpp参考网站上的其他链接。 - Shoe
如果我想要通过多个其他函数传递在函数链中创建的指针,并且只在函数链的末尾销毁它,你会建议我使用哪种指针? - Hobbyist
@业余爱好者,可能是一个std::shared_ptr - Shoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接