C ++ странная ошибка сегментации при создании объекта - PullRequest
0 голосов
/ 05 ноября 2010

У меня странная проблема с инициацией объекта класса. Проблема так же странна, а не легко воспроизводима. Однако я постараюсь привести показательный пример. У меня есть классы наследования.

class BarClass {
public:
   BarClass() {
      ...
   }
   BarClass(int i, int j) {
      ...
   }
   void doSomething() { ... }
};
class FooClass : public BarClass {
public:
   FooClass() {
   }
   FooClass(int i, int j) : BarClass(i,j) {
      ...
   }
};

Иногда, если я инициирую объекты следующим образом, я получаю ошибку ошибки сегментации при инициализации.

FooClass foo1;
foo1.doSomething();
FooClass foo2(10, 20);
foo2.doSomething();

Если я использую явный указатель new, то все в порядке ..

FooClass *foo1= new FooClass();
foo1->doSomething();
FooClass foo2(10, 20);
foo2.doSomething();

Следующий код выдаст мне ошибку компилятора в строке 2.

FooClass foo1();
foo1.doSomething();
FooClass foo2(10, 20);
foo2.doSomething();

как мне правильно инициировать объект, особенно если у него есть конструктор по умолчанию и конструкторы с аргументами.

Ответы [ 4 ]

7 голосов
/ 05 ноября 2010

Ваша первая проблема в первую очередь ...

FooClass foo1();

не создает объект типа FooClass, но объявляет функцию foo1 (), которая не принимает параметров и возвращает FooClass.Удалите скобки, чтобы создать экземпляр, как вы это делали в первом примере кода.

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

2 голосов
/ 05 ноября 2010

Скорее всего, sizeof(YourClass) слишком велико для стека, что объясняет, почему успешно выполняется только выделение кучи.

2 голосов
/ 05 ноября 2010

Возможно, у вас есть ошибка в вашем конструкторе или в doSomething().Не зная, что происходит в этих функциях, невозможно сказать, что это за ошибка.

0 голосов
/ 05 ноября 2010

Используйте только -> с указателями.

FooClass foo1();
foo1->doSomething();

должен быть

FooClass foo1;
foo1.doSomething();
...