У меня есть класс формыПочему деструктор называется многократным, когда объект класса, содержащий элемент указателя, передается по ссылке? Как это исправить?
class A
{
int **a;
//other members
}
В некоторой функции, я передать объект класса А, скажем, obj
, по ссылке
void func(A &o); //function declaration
и
func(std::ref(obj)); //function call
Однако , Я получил следующую ошибку - double free or corruption (!prev)
В соответствии с связанным вопросом это происходит потому, что деструктор вызывается несколько раз для элемента-указателя, что является следствием того, что экземпляр-копия вызывается несколько раз при копировании, в результате чего попытка освобождения памяти уже освобождена. Однако, поскольку я передаю полный объект по ссылке, почему это должно произойти? Не следует ли просто скопировать адрес всего объекта?
Предложения по реализации конструктора копирования в форме, указанной в приведенной выше ссылке, и here не помогут, поскольку они предусматривают выделение свежего количества памяти всякий раз, когда объект копируется, тогда как я хотел бы передать объект и как в результате элемент указателя, по ссылке.
Я просмотрел this и this потенциальные дубликаты, но они не решили мою проблему.
на основе нескольких других ответов, я также попытался реализации деструктор в
~A()
{
delete[] a;
}
или
~A()
{
if(a)
{
delete[] a;
}
}
но и не решить эту проблему.
Где-то в коде, который вы не указали, вы передаете свой объект по значению, поэтому сделана копия. Если вам нужна дополнительная помощь, покажите [MCVE] (http://stackoverflow.com/help/mcve) –
Запретить копирование ctor, а оператор присваивания и компилятор скажут вам, где вы копируете данные по значению. – Slava
@Slava Как мне это сделать? – GoodDeeds