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

Ale*_*lex 7 c++ templates destructor

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

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

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

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

R S*_*hko 6

如果你不知道它是否与分配做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;
Run Code Online (Sandbox Code Playgroud)

但是你这样做:

// crashes on my platform
std::string *strings = new std::string[10];
delete strings;
Run Code Online (Sandbox Code Playgroud)

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

小智 6

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


Jon*_*onH 5

简短回答:

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

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

//later on...destructor...
delete m; //wrong
delete[] m; //correct
Run Code Online (Sandbox Code Playgroud)

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

  • 不,如果Boost解决了*一切*,我就不会秃头了.但对于C++编码,它非常方便. (3认同)
  • 没有真正回答他的问题.他可能会理解使用正确的"删除"功能很重要,否则他就不会问他的问题.:P (2认同)