析构函数 - 我应该使用delete还是delete[]?

7

我正在编写一个模板类,它以指针作为输入并存储它。该指针指向由另一个类分配的对象,并交给包含该类的指针。

现在我想为这个容器创建一个析构函数。我应该如何释放该指针指向的内存?我无法事先知道它是数组还是单个元素。

我对C ++还比较新,请见谅。我一直在使用C,Java是我选择的面向对象语言,但由于想要学习C ++和项目的速度要求,我选择了C ++。

将容器从模板更改为抽象类的容器,可以实现自己的析构函数,这是一个更好的主意吗?


3
JonH的答案是正确的,因此也许你应该提供模板:一个用于数组,另一个不用。另一个答案是避免使用数组,而是期望一个单一的实例,它可能是或可能不是一个自我清理的正确集合,例如vector<>。 - Steven Sudit
1
@Steven Sudit:我认为你应该把那个评论变成一个答案。 - Fred Larson
你可能会在这种方法中遇到线程问题 - 你不能删除在不同线程中分配的东西。 - ChrisF
1
此外,@Alex:如果你是C++的新手,尝试找到干净易懂的方法可能会很困难。通常最好的方法是直接说“我正在调用delete,所以不要给我数组”,而不是试图让它同时适用于两种情况。理想情况下,人们应该使用vector而不是原始内存数组。 - GManNickG
@GMan - 啊,那是几年前我遇到的问题,所以可能是跨进程而不仅仅是跨线程。 - ChrisF
显示剩余3条评论
11个回答

0
简单来说,仅凭动态分配内存的指针,无法确定如何安全地释放它。该指针可能已通过以下任一方式分配:
  • 使用 new
  • 使用 new []
  • 使用 malloc
  • 使用用户定义函数
  • 等等。

在所有情况下,在您可以释放内存之前,必须知道它是如何分配的。


你基本上需要决定你的类是代表一个smart_ptr还是一个smart_array,然后让调用者提供一个适当分配的指针给你的类。 - UncleBens
@UncleBens 不确定您的评论对我的回答意味着什么 - 尽管它的名称是“智能指针”,但它并不是一个指针。 - anon
我的意思是,如果你只有一个指针,那么你无法确定它是如何分配的。但我认为问题并不止于此。你只需要说,“我这里有一个类,它将调用delete/delete[]/free()/用户定义的释放函数,而使用你的类的用户则需要提供一个适当分配的指针。”基本上,你只需要做一些有意义的事情,其他的就不是你的问题了。 - UncleBens
@UncleBens 不是要过多批评你的风格,但在评论中请尽量区分回答者(默认为“你”)和提问者。 - anon
好的。在我的评论中,“你”通常指的是一般情况下的类的设计师/程序员。我猜想在你的回复中,你可能并不是指“……在你,Alex,释放内存之前……” :) - UncleBens
显示剩余2条评论

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