C++中delete和delete[]运算符有什么区别?
首先,根据C++标准,使用delete分配的任何内容new[]都是未定义的行为.
在Visual C++ 7中,这种配对可能导致两种后果之一.
如果类型new []'ed有简单的构造函数和析构函数VC++只是使用new而不是new[]和使用delete该块工作正常 - new只调用"分配内存",delete只调用"空闲内存".
如果new []'ed类型有一个非平凡的构造函数或析构函数,则无法完成上述技巧 - VC++ 7必须调用恰当数量的析构函数.因此它预先在数组中size_t存储元素的数量.现在,地址返回的地址new[]到第一个元素,而不是块的开头.因此,如果delete使用它只调用第一个元素的析构函数和调用"空闲内存",其地址不同于"分配内存"返回的地址,这导致HeapFree()内部的一些错误指示我怀疑是指堆腐败.
然而,每个人都可以阅读使用deleteafter new[]导致内存泄漏的错误陈述.我怀疑任何大小的堆损坏都比仅为第一个元素调用析构函数并且可能没有调用的析构函数没有释放堆分配的子对象这一事实重要得多.
如何使用delete之后new[]可能只会导致某些C++实现中的内存泄漏?
我正在编写一个性能关键型应用程序,我在其中创建大量类似类型的对象来下订单.我使用boost :: singleton_pool来分配内存.最后我的班级看起来像这样.
class MyOrder{
std::vector<int> v1_;
std::vector<double> v2_;
std::string s1_;
std::string s2_;
public:
MyOrder(const std::string &s1, const std::string &s2): s1_(s1), s2_(s2) {}
~MyOrder(){}
static void * operator new(size_t size);
static void operator delete(void * rawMemory) throw();
static void operator delete(void * rawMemory, std::size_t size) throw();
};
struct MyOrderTag{};
typedef boost::singleton_pool<MyOrderTag, sizeof(MyOrder)> MyOrderPool;
void* MyOrder:: operator new(size_t size)
{
if (size != sizeof(MyOrder))
return ::operator new(size);
while(true){
void * ptr = MyOrderPool::malloc();
if (ptr != NULL) return ptr; …Run Code Online (Sandbox Code Playgroud) 我有课Graph和Algorithm:
class Graph
{
...
};
class Algorithm
{
...
private:
Graph * mGraph;
...
};
Run Code Online (Sandbox Code Playgroud)
我希望我的算法mGraph除了删除它之外能够做任何事情.即我想检测(在编译时)算法中的某处我正在删除图形.有这么好的(优雅)方式做这样的事情吗?(我实现的唯一方法是将Graph析构函数设为私有,因此只有朋友类才有权删除它)