我也遇到过下面的代码:
class a {
public:
void * operator new(size_t l, int nb);
double values;
};
void *a::operator new (size_t l,int n)
{
return new char[l+ (n>1 ? n - 1 : 0)*sizeof(double)];
}
从我得到了它然后使用具有状结构的数组,开始在“值”:
double* Val = &(p->a->values) + fColumnNumber;
我的问题是:是否有内存泄漏? 我是很新的重载新的运营商,但我敢肯定,分配的内存不正确释放。 也是否意味着我永远不能在栈上创建一个“A”级?
谢谢
我相信它在技术上产生UB,因为它是,虽然这是UB的一种形式,它可能永远不会引起明显的副作用(它使用new []
但我相信,会得到与匹配了delete
-但对char
,这通常不会造成明显的问题)。
海事组织,它几乎更糟糕的是它采用了全新的表达分配什么真正应该原始字节,而不是对象。 如果我这样做,我会写这样的:
void *a::operator new (size_t l,int n)
{
return ::operator new(l+ (n>1 ? n - 1 : 0)*sizeof(double));
}
你会匹配了:
void a::operator delete(void *block)
{
::operator delete(block);
}
我不明白为什么默认operator delete
叫上a *
将不能正确地解出分配这个自定义分配的内存operator new
。 要检查的最好的办法就是实际编写一些代码,并找出,虽然不是rob05c的技术我可能会在一个分析器运行诸如Valgrind的。 我想提问看到内存泄漏发生,怀疑这是原因,所以写测试用例解决此运营商似乎是一个值得努力。
显然,如果没有人得到各地的实际删除它之后它会泄漏...
我怀疑压倒一切的必要性, new
的这种功能,但我也认为这是别人的代码。
这是很容易找到的。 写一个循环,构建和解构批A的,而且看你的内存使用情况。 如果它的泄漏,它会非常快上去。
它的,因为它是罚款,但你需要使用delete[]
不delete
,从使用这个类,因为它分配一个数组的代码。 需要注意的是,用户将无法得到他们需要做到这一点任何提示 - 所以重载delete运算符对他们来说将是一个好主意。
- 你可以在“一”在栈上创建绝对类。
有4个(实际上更多,但将基本棒)新和删除,你应该知道方法签名。
void* operator new (std::size_t size) throw (std::bad_alloc); void* operator new[] (std::size_t size) throw (std::bad_alloc); void operator delete (void* ptr) throw (); void operator delete[] (void* ptr) throw ();
您应在“经营者新的[]”的方法来进行的“运营商新的”方法中分配的数组。 这将让你摆脱讨厌的检查。 写两个,“运营商新的”和“运营商新的[]”
不要忘了,你想给调用者类型的对象“一”( a myA = new a
),以便确保您回到“一”不是char *,因此,你需要还可以铸造。
你需要写相应的删除[]和删除的方法。
要回答你的问题,我相信它不会泄漏内存。 您所提供的新的签名被称为“放置新的”。 这使您可以分配一个新的指针,未分配的内存,但给它指向的位置。 例如:如果你需要一个指向内存中的特定点。
long z = 0x0F9877F80078; a myA = new (z) a[5]; // 5 pointers that point to 0x0F9877F80078
根据定义,投放新的运营商不应该分配内存,因为你有你做漏水。 摆脱你的第二个参数,你可以因为你有2个版本,运营商新的,你去好现在要做的。 不要忘了返回一个对象“一”。
看看IBM的信息中心: http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr318.htm
与基准或参考,cpluplus.com: http://www.cplusplus.com/reference/std/new