2012-04-11 2 views
0

Im имея "* Glibc обнаруженной /дом/убунт [....]: двойной бесплатно или повреждение (fasttop): 0x09851168 * *" проблема.C++ ошибка памяти ("двойная бесплатно или коррупция")

отладки я понял, линию, которая, кажется, является источником проблемы:

data[i]->~Class(); 

которым относится к

class Class { 
public: 
    Class(); 
    Class(char *name, double value); 
    virtual ~Class(); 
    char *name; 
    double value; 
private: 

}; 

затем

Class::Class() { 
} 

Class::Class(char* name, double value){ 
    this->name = new char[std::strlen(name)]; 
    std::strcpy(this->name, name); 
    this->value = value; 
} 

Class::~Class() { 
    delete name; 
} 

сейчас, очевидно, я я делаю что-то неправильно. Кто-нибудь может мне что сказать?

+0

Для такого рода ошибок обычно стоит работать под valgrind, чтобы получить дополнительную информацию о том, что вызывает проблему.(Но я подозреваю, что уже опубликованные ответы верны) –

ответ

1

Я знаю только о нескольких обстоятельствах, при которых вы используете: data[i]->~Class();. Во-первых, вы используете новое место для создания объекта в этом месте. Другой заключается в том, что вы повторно инициализируете объект, уничтожив его, чтобы немедленно следовать за ним, используя новое место для создания нового объекта. Оба они довольно передовые методы, и довольно откровенно, довольно необычные, за исключением случаев, когда вы создаете собственный коллекционный класс.

Я предполагаю, что 1) вам это не нужно, и 2) вы действительно не показали нам код, который имеет значение (что, скорее всего, связано с явным вызовом dtor).

У вас есть еще один незначительные проблемы с выделения name с new[] и удалить его с delete name; - два должны совпадать, так что вы должны использовать delete [] name;. Учитывая, что это массив из char, это, в основном, техничность - это почти наверняка не вызовет проблемы в этом случае. Если бы это был массив объектов, которые имели нетривиальные деструкторы, типичным симптомом было бы то, что некоторые (большинство) из объектов не были должным образом уничтожены (т. Е. Их деструкторы не будут вызваны). Теоретически это просто неопределенное поведение, так что ничего может быть, но реальные шансы на то, что он является источником вашей проблемы, чрезвычайно удалены (особенно, как я сказал, в случае массива char).

Конечно, вам действительно нужно сделать name a std::string и вообще пропустить всю эту глупость.

+0

«Другое дело в том, что вы повторно инициализируете объект, уничтожив его, за которым следует сразу же использовать новое место для создания нового объекта». это тот случай. Это список объектов, поэтому я вызываю деструктор при удалении объекта «Класс» из списка. –

+0

@Johnsmith: В этом случае, вероятно, стоит опубликовать этот код, чтобы мы могли видеть, как он работает (или не работает, в зависимости от обстоятельств). –

7

Вещи вы делаете неправильно является явным вызовом деструктора:

data[i]->~Class(); 

Если вы абсолютно знает, что вы должны быть явным вызов его (это необычно, и многое огромные программ никогда не иметь необходимости чтобы сделать это), то вы должны, вероятно, вместо того, чтобы использовать delete:

delete data[i]; 
1
data[i]->~Class(); 

вы никогда не должны вызывать деструктор или тому подобное. Либо delete, если он был выделен new, либо просто ничего не делать, и деструктор будет вызываться, когда объект выходит за пределы области видимости.

Смежные вопросы