Могу ли я создать массив auto_ptr?

У меня есть базовый класс, который наследуется несколькими производными классами. Я хочу, чтобы создать массив 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 : '['

4

Решение

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 в результате он говорит мне, что утечка невозможна.

7

Другие решения

Я только что выполнил два теста 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], который находится вне связей).

1

Ваша проблема, вероятно, не с auto_ptr, хотя это устарело, и вы должны использовать unique_ptr или же shared_ptr вместо этого (если ваш компилятор не поддерживает C ++ 11, используйте boost::shared_ptr). Кажется, что утечка в реализации вашего класса. Проверить, если base имеет виртуальный деструктор, потому что вам это нужно, если вы хотите использовать класс полиморфно. Также проверьте наличие каких-либо членов базовых и производных классов и удалите все, что вы выделили.

1