Контейнер указателей Issue - PullRequest
       14

Контейнер указателей Issue

1 голос
/ 04 сентября 2011

У меня есть классы A, B, C, D и следующая иерархия:

class A {
    B* b;
};

class B {
    C<D>* c;
};

template <class T>
class C<T> {
    list<T*> ds;
};

class D {
};

Сначала я выделяю A как член A* внутри базового класса, используя new A(). В пределах A я выделяю b, используя new B(). В пределах B я выделяю c, используя new C<D>().

Как только я пытаюсь вызвать ds.size(), программа вылетает. EXC_BAD_ACCESS возникает внутри ds, когда он пытается вызвать свой метод begin() в size().

Вы знаете, почему это произошло? Я использую C ++ в течение нескольких лет, но это мой первый опыт использования указателей в стандартных контейнерах, поэтому, возможно, я упускаю что-то очевидное.

Ответы [ 2 ]

1 голос
/ 04 сентября 2011

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

Функция .size должна просто возвращать значение внутреннего члена, хотя не имеет большого смысла, чтобы это было причиной сбоя. Вы уверены, что все правильно распределено в вашем реальном коде? для меня это звучит так, будто у вас есть неинициализированный указатель где-то в цепочке вызовов.

0 голосов
/ 04 сентября 2011

Но я думаю, что член b класса A по умолчанию равен private. Может быть, это вызывает EXC_BAD_ACCESS.

...