我有一个基类,它由多个派生类继承。我想创建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 : '['
答案 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_ptr
或shared_ptr
(如果您的编译器不支持C ++ 11,请使用{ {1}})。看起来泄漏是在你的类实现中。检查boost::shared_ptr
是否具有虚拟析构函数,因为如果要以多态方式使用该类,则需要这样做。还要检查基类和派生类的任何成员,并删除您分配的所有内容。