【发布时间】:2016-05-09 20:13:01
【问题描述】:
我刚刚遇到了一些 C++ 中的容器实现。该类使用内部缓冲区来管理其对象。这是一个没有安全检查的简化版本:
template <typename E> class Container
{
public:
Container() : buffer(new E[100]), size(0) {}
~Container() { delete [] buffer; }
void Add() { buffer[size] = E(); size++; }
void Remove() { size--; buffer[size].~E(); }
private:
E* buffer;
int size;
};
AFAIK 如果new/delete 未自定义,这将在Container() 和~Container() 中冗余构造/销毁E 对象。这似乎很危险。
在Add() 中使用放置new 是防止危险的冗余构造函数/析构函数调用(除了将类绑定到功能齐全的池)的最佳方法吗?
当使用放置new 时,new char[sizeof(E)*100] 是分配缓冲区的正确方法吗?
【问题讨论】:
-
这段代码有很多问题,但是这段代码中没有放置-
new。 -
不,不是。我从没说过会。
-
我明白了,我当时误解了这个问题。
-
我想你想在
Remove()中解构buffer[size-1],或者在解构之前先递减。按照您的示例中的编写方式,您遇到了一个错误。 -
@mindriot:你是对的。由于提取示例而导致的错误。修好了。
标签: c++ memory-management placement-new object-construction object-destruction