У меня есть базовый класс, который наследуется несколькими производными классами. Я хочу, чтобы создать массив autopointer указателя baseClass. когда я инициализирую те autopointer, я получаю некоторую ошибку времени компиляции, тогда я пытался сделать так
std::auto_ptr<base>pbase[3];
std::auto_ptr<base> b1(new derived1());
std::auto_ptr<base> b2(new derived2());
std::suto_ptr<base> b3(new derived3());
pbase[0] = b1;
pbase[1] = b2;
pbase[2] = b3;
все работает нормально, я исправил проблему утечки памяти, в то время как у меня одно окно, я не использую valgrind, я использую boost framework для утечек.
для ошибки компиляции:
class A{
public:
std::auto_ptr<base>pbase[2];
}
в файле A.cpp
A::A():pbase[0](new derived1()), pbase[1](new derived2()){
}
я получил ошибку C2059:syntax error : '['
std::auto_ptr
устарела с C ++ 11 и не должна использоваться из-за странного поведения копирования:
std::auto_ptr<int> a(new int(1));
std::auto_ptr<int> b = a; // invalidates a!
То, чего он пытался достичь, теперь решается чисто std::unique_ptr
, До введения семантики перемещения и ссылок на rvalue это было невозможно.
Тем не менее, это не проблема здесь. Из вашего примера возможно, что у вас утечка памяти, потому что вы вызываете неопределенное поведение:
pbase[3] = b3; // pbase is std::auto_ptr<base>[3]
// pbase[0] - pbase[2] are valid indexes
На самом деле, когда Я исправляю эту проблему и беги valgrind --leak-check=full ./auto_ptr_app
в результате он говорит мне, что утечка невозможна.
Я только что выполнил два теста valgrind для следующих частей кода:
Первый забег:
class Foo
{
public:
Foo(){}
virtual ~Foo(){}
};
class Bar: public Foo
{
public:
Bar(){}
virtual ~Bar(){}
};
int main(int argc, char** argv)
{
std::auto_ptr<Foo>arr[3];
std::auto_ptr<Foo> one(new Bar());
std::auto_ptr<Foo> two(new Bar());
std::auto_ptr<Foo> three(new Bar());
arr[0] = one;
arr[1] = two;
arr[2] = three;
return 0;
}
Второй прогон:
class Foo
{
public:
Foo(){}
virtual ~Foo(){}
};
class Bar: public Foo
{
public:
Bar(){}
virtual ~Bar(){}
};
int main(int argc, char** argv)
{
std::auto_ptr<Foo> one(new Bar());
return 0;
}
Хотя Valgrind действительно показывает возможные утечки памяти в обоих случаях, отображаемые предупреждения именно так одинаковые (одинаковое количество предупреждений, одинаковый текст предупреждений, одинаковый стек) для них обоих, указывающие где-то за пределами моего кода на файлы linux .so. Таким образом, мы можем предположить, что способ использования массива auto_ptr
Это хорошо. Однако, как указано в комментариях, начиная с C ++ 0x (который является текущим стандартом C ++), auto_ptr
считается устаревшим из-за его странного поведения копирования (вы можете найти больше информации, например, в этой статье). Рекомендуется использовать std::unique_ptr
вместо.
Теперь, если у вас есть некоторые дополнительные утечки памяти в вашем коде, то, скорее всего, это происходит из-за ваших собственных классов. К сожалению, вы не включили их в вопрос, поэтому мы не можем сказать. В таком случае вам следует проверить конструкторы и деструкторы ваших классов на наличие утечек памяти или, по крайней мере, показать нам ваши классы. Другой причиной может быть опечатка в индексе массива, который вы имеете в коде (pbase[3]
, который находится вне связей).
Ваша проблема, вероятно, не с auto_ptr
, хотя это устарело, и вы должны использовать unique_ptr
или же shared_ptr
вместо этого (если ваш компилятор не поддерживает C ++ 11, используйте boost::shared_ptr
). Кажется, что утечка в реализации вашего класса. Проверить, если base
имеет виртуальный деструктор, потому что вам это нужно, если вы хотите использовать класс полиморфно. Также проверьте наличие каких-либо членов базовых и производных классов и удалите все, что вы выделили.