是以下新的过载泄漏内存?

lez*_*lon 4 c++ memory-management operator-overloading new-operator

我遇到了以下代码:

    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)];
}
Run Code Online (Sandbox Code Playgroud)

从我得到它然后用于具有从"值"开始的数组结构:

double* Val = &(p->a->values) + fColumnNumber;
Run Code Online (Sandbox Code Playgroud)

我的问题是:是否有内存泄漏?我对重载新运算符很新,但我很确定分配的内存没有正确释放.这也意味着我永远不能在堆栈上创建一个"a"类?

谢谢

Jer*_*fin 5

我相信它在技术上会产生UB,虽然它是UB的一种形式,它可能永远不会引起明显的副作用(它正在使用new [],但我相信它会与之匹配delete- 但是char,这通常不会导致一个明显的问题).

IMO,它使用一个新的表达式分配应该是真正的原始字节而不是对象,这几乎更糟糕.如果我这样做,我会写它:

void *a::operator new (size_t l,int n)
{
    return ::operator new(l+ (n>1 ? n - 1 : 0)*sizeof(double));
}
Run Code Online (Sandbox Code Playgroud)

你可以匹配:

void a::operator delete(void *block)
{
    ::operator delete(block);
}
Run Code Online (Sandbox Code Playgroud)