Возможный дубликат:
Что такое правило трех?
Как именно std::pair
вызывает деструкторы для своих компонентов? Я пытаюсь добавить экземпляры класса в std::map
, но получаю ошибки относительно деструктора моего класса.
Я сузил свой вопрос / проблему до следующего чрезвычайно простого примера.
Ниже my_class
просто создает int
массив при построении и удаляет его при уничтожении. Как-то я получаю ошибку "двойное удаление":
//my_class.h
class my_class {
public:
int an_int;
int *array;
//constructors:
my_class()
{
array = new int[2];
}
my_class(int new_int) : an_int(new_int)
{
array = new int[2];
}
//destructor:
~my_class()
{
delete[] array;
}
}; //end of my_class
Между тем, в main.cpp ...
//main.cpp
int main(int argc, char* argv[])
{
std::map<int, my_class> my_map;
my_map.insert( std::make_pair<int, my_class> (1, my_class(71) ) );
return 0;
} // end main
Компиляция проходит нормально, но при этом возникает следующая ошибка времени выполнения:
*** glibc detected *** ./experimental_code: double free or corruption (fasttop):
Или с valgrind:
==15258== Invalid free() / delete / delete[] / realloc()
==15258== at 0x40249D7: operator delete[](void*) (vg_replace_malloc.c:490)
==15258== by 0x8048B99: main (my_class.h:38)
==15258== Address 0x42d6028 is 0 bytes inside a block of size 8 free'd
==15258== at 0x40249D7: operator delete[](void*) (vg_replace_malloc.c:490)
==15258== by 0x8048B91: main (my_class.h:38)
(номера строк отключены, потому что я вырезал комментарии и прочее)
Должно быть, я что-то упускаю по поводу _9 _...?
Заранее всем спасибо!
int array[2]
вместоint *array
? - person Pubby   schedule 17.01.2012std::vector<int> an_array
. - person Robᵩ   schedule 17.01.2012std::vector
в качестве домашнего задания), хорошо, хорошо знать о правиле трех. - person Xeo   schedule 17.01.2012struct B
содержит 2 64-битныхint m1,m2
. ПроизводныеDcc
иDuc
: первый использует copy / ass компилятора, второй - определяемый пользователемDuc(Duc const & f):B(f.m1, f.m2){}
и тривиальныйoperator=
. Настройка:Dcc lcc(SomeRandomN(), 0), lcc1;
, тест:Dcc lcc2(lcc); lcc1=lcc;
. То же самое дляDuc
. В случаеDcc
полная оптимизация скорости VC ++ 10:movdqa xmmword ptr [stack.addr],xmm0;
, вDuc
:mov qword ptr [stack.addr1],rdi; mov qword ptr [stack.addr2],rdi;
. Результат: компилятор оптимизирует две инструкции в 1 с копией по умолчанию. На 33% быстрее. - person lapk   schedule 17.01.2012std::vector
. Или вы видели их реализациюvalarray
? Он основан на шаблонах выражений. У меня создается впечатление, что вы слишком много внимания уделяете микрооптимизациям, а не ремонтопригодности и правильности. У C ++ есть то преимущество, что по умолчанию вы можете писать хороший и быстрый код. И плохой (в отношении удобства обслуживания), и молниеносный код с некоторыми усилиями. - person Sebastian Mach   schedule 18.01.2012