4

我有一个基类,它由多个派生类继承。我想创建基类指针的自动指针数组。当我初始化那些自动指针时,我得到了一些编译时错误,然后我尝试这样做

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 : '['

4

3 回答 3

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

事实上,当我修复该问题并运行valgrind --leak-check=full ./auto_ptr_app结果时,它告诉我不可能发生泄漏。

于 2013-08-22T07:33:16.757 回答
1

您的问题可能与 无关auto_ptr,尽管它已被弃用,您应该使用unique_ptrorshared_ptr代替(如果您的编译器不支持 C++11,请使用boost::shared_ptr)。似乎泄漏在您的类实现中。检查是否base有虚拟析构函数,因为如果你想多态地使用类,你需要它。还要检查基类和派生类的任何成员并删除您分配的所有内容。

于 2013-08-22T08:45:15.040 回答
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被认为已弃用,因为它具有奇怪的复制行为(例如,您可以在本文中找到更多信息)。建议std::unique_ptr改用。

现在,如果您的代码中有一些额外的内存泄漏,那么很可能是由于您自己的类而发生的。不幸的是,您没有将它们包含在问题中,因此我们无法确定。在这种情况下,您应该检查类的构造函数和析构函数是否存在内存泄漏,或者至少向我们展示您的类。另一个原因可能是您在代码中的数组索引中的拼写错误(pbase[3],它没有键)。

于 2013-08-22T07:34:30.447 回答