我可以创建一个auto_ptr数组吗?

时间:2013-08-22 07:14:13

标签: c++ visual-studio-2010 visual-c++ auto-ptr

我有一个基类,它由多个派生类继承。我想创建baseClass指针的autopointer数组。当我初始化那些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框架进行泄漏。

编译错误:

class A{
 public:
  std::auto_ptr<base>pbase[2];
}

在A.cpp文件中

A::A():pbase[0](new derived1()), pbase[1](new derived2()){
}

我收到错误C2059:syntax error : '['

3 个答案:

答案 0 :(得分:7)

std::auto_ptr自C ++ 11以来已弃用,因其奇怪的复制行为而不应使用:

std::auto_ptr<int> a(new int(1));
std::auto_ptr<int> b = a; // invalidates a!

它试图实现的目标现在由std::unique_ptr干净利落地解决了。在引入移动语义和右值引用之前,这是不可能的。

但是,这似乎不是问题所在。从您的示例中,您可能会因为调用未定义的行为而泄漏内存:

pbase[3] = b3; // pbase is std::auto_ptr<base>[3]
               // pbase[0] - pbase[2] are valid indexes

事实上,当I fix that problem并在结果上运行valgrind --leak-check=full ./auto_ptr_app时,它告诉我没有泄漏是可能的。

答案 1 :(得分:1)

我刚刚对以下代码运行了两个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被认为已被弃用,因为它具有奇怪的复制行为(您可以找到更多信息,例如{{3} }})。建议改为使用std::unique_ptr

现在,如果你的代码中有一些额外的内存泄漏,那很可能是因为你自己的类。不幸的是,你没有将它们纳入问题,所以我们无法分辨。在这种情况下,您应该检查类的构造函数和析构函数是否存在内存泄漏,或者至少向我们展示您的类。另一个原因可能是您在代码中使用的数组索引中的拼写错误(pbase[3],其中没有债券)。

答案 2 :(得分:1)

您的问题可能不在auto_ptr,虽然已弃用,您应该使用unique_ptrshared_ptr(如果您的编译器不支持C ++ 11,请使用{ {1}})。看起来泄漏是在你的类实现中。检查boost::shared_ptr是否具有虚拟析构函数,因为如果要以多态方式使用该类,则需要这样做。还要检查基类和派生类的任何成员,并删除您分配的所有内容。