当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《析构函数-我应该使用删除还是删除[]?》经验,为你挑选了3个好方法。

我正在编写一个模板类,它将指针作为输入并存储它.指针旨在指向由另一个类分配的对象,并将其传递给此包含类.

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

我是C++的新手,所以请耐心等待.我一直使用C语言,而Java是我选择的OO语言,但在想要学习C++和我的项目的速度要求之间,我已经使用了C++.

将容器从模板更改为容器是否可以实现自己的析构函数?



1> R Samuel Kla..:

如果你不知道它是否与分配做newnew[],那么它是不是安全地删除它.

您的代码可能似乎有效.例如,在我工作的一个平台上,差异仅在您拥有具有析构函数的对象数组时才有意义.所以,你这样做:

// by luck, this works on my preferred platform
// don't do this - just an example of why your code seems to work
int *ints = new int[20];
delete ints;

但是你这样做:

// crashes on my platform
std::string *strings = new std::string[10];
delete strings;


@Steven:很幸运.错误匹配`new`和`delete`会导致未定义的行为,周期.即使类型具有普通的析构函数,也未定义.对于我来说,将'operator new`和`operator delete`替换为一个合适的东西是完全合理的.我可以指望我的`delete`函数中的指针已被相应的`new`输出.
@Steven - 运气好,因为当类型没有析构函数时,平台*选择*来优化数组分配.但是另一个平台可以以不同的方式处理这个问题,然后代码会在另一个平台上中断

2> 小智..:

您必须记录此类预期的使用方式,并始终按预期分配.您还可以将标志传递给对象,指定它应该如何销毁.另请参阅boost的智能指针,它可以为您处理这种区别.



3> JonH..:

简短回答:

如果你使用[]和new你想使用[]删除.

//allocate some memory
myObject* m = new myObject[100];

//later on...destructor...
delete m; //wrong
delete[] m; //correct

那是裸骨,你能看到的另一件事就是提升.考虑到你不确定它是一个数组还是单个对象,也很难回答.你可以通过一个标志告诉你的应用程序是否使用删除或删除[]来检查这一点.


不,如果Boost解决了*一切*,我就不会秃头了.但对于C++编码,它非常方便.
没有真正回答他的问题.他可能会理解使用正确的"删除"功能很重要,否则他就不会问他的问题.:P
推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有