У меня есть класс, который выделяет память в куче, а затем деструктор освобождает его. По какой-то причине мой конструктор копий никогда не вызывается, и я не понимаю, почему. Вот моя реализация:Конструктор копирования, который не называется
AguiBitmap::AguiBitmap(const AguiBitmap &bmp)
{
this->nativeBitmapPtr = al_clone_bitmap(bmp.nativeBitmapPtr);
}
AguiBitmap::AguiBitmap(char *filename)
{
if(!filename)
{
nativeBitmapPtr = 0;
return;
}
nativeBitmapPtr = al_load_bitmap(filename);
if(nativeBitmapPtr)
{
width = al_get_bitmap_width(nativeBitmapPtr);
height = al_get_bitmap_height(nativeBitmapPtr);
}
else
{
width = 0;
height = 0;
}
}
ALLEGRO_BITMAP* AguiBitmap::getBitmap() const
{
return nativeBitmapPtr;
}
Однако Когда я сделать что-то вроде:
AguiBitmap bitmap;
bitmap = AguiBitmap("somepath");
код конструктор копирования не вызывается (установить контрольную точку). И поэтому мой вопрос о наличии недопустимого указателя в восстановленном объекте из временного объекта становится недействительным, когда временный объект уничтожается.
Что мне нужно сделать, чтобы получить вызов моего конструктора копий?
Благодаря
О, хорошо спасибо – jmasterx
Я не думаю, что этот обмен будет работать так, как есть. Во-первых, вы должны поместить 'using std :: swap' в эту' swap() 'свою функцию, чтобы выбрать' std :: swap() '. Во-вторых, в операторе присваивания либо вызовите член класса 'swap (tmp)', либо (лучше) добавьте специализацию/перегрузку для свободной функции 'swap()'. – sbi
@sbi: вы правы, что там должно быть 'использование std :: swap'. И то, что вы описываете, это то, что делает оператор присваивания - «помощник» «AguiBitmap :: swap()» предназначен для статического члена класса «AguiBitmap». Если предпочтение состоит в том, чтобы сделать его нестационарным членом, который принимает только «другой» аргумент или явную специализацию шаблонного 'std :: swap', который, безусловно, можно было бы сделать. –