оператор перегрузки новый без оператора перегрузки удалить - PullRequest
0 голосов
/ 30 октября 2010

HI All

У меня есть простой код ниже.Я определил новый оператор для своего класса без оператора delete.В соответствии с valgrind --leak-check=yes PROGRAM_NAME у меня есть несоответствие, т.е. я выделяю с помощью new[] для массивов, но я освобождаю с помощью простого delete для не массивов.Знаете почему?

С уважением AFG

#include<string>
#include<new>


class CA{
public:
CA(){
    std::cout << "*created CA*";
}   

~CA(){
    std::cout << "*deleted*";
}

void* operator new( std::size_t aSize ){
    std::cout << "*MY NEW*";
    void* storage = std::malloc( aSize );
    if( !storage )
    {
        std::exception ex;
        throw ex;
    }
    return storage;
}};

int main(int argc, char** argv){
CA* p = new CA();
delete p;   
return 0;

}

==2767== Mismatched free() / delete / delete []
==2767==    at 0x4024851: operator delete(void*) (vg_replace_malloc.c:387)
==2767==    by 0x80488BD: main (operator_new_test.cpp:54)
==2767==  Address 0x42d3028 is 0 bytes inside a block of size 1 alloc'd
==2767==    at 0x4024F20: malloc (vg_replace_malloc.c:236)
==2767==    by 0x80489A4: CA::operator new(unsigned int) (operator_new_test.cpp:18)
==2767==    by 0x804887B: main (operator_new_test.cpp:53)

Ответы [ 3 ]

8 голосов
/ 30 октября 2010

Ваш перегруженный оператор new использует malloc, но затем вы освобождаетесь, используя обычный оператор C ++ delete.Это классическая ошибка.Если вы выделяете с malloc, вы должны всегда освобождать с free.Если вы выделяете с new, вы должны всегда освобождать с помощью delete (или delete[] в случае массивов).

Вам потребуется перегрузить deleteОператор и позвонить ему free().

1 голос
/ 30 октября 2010

Когда вы перегрузите оператор new, вы должны перегрузить оператор перегрузки, чтобы вы знали, что вызывается правильная функция освобождения (в данном случае бесплатная).

Есть пара проблем с вашимперегрузка также;см. мой пример перегрузки новой .Просто замените allocate_from_some_other_source на malloc, а deallocate_from_some_other_source на бесплатный.

0 голосов
/ 30 октября 2010

Если вы используете malloc, вы должны освободить free.

...