在shared_ptr被销毁时堆损坏

时间:2014-03-08 06:41:59

标签: c++ visual-studio-2012

考虑以下示例代码:

Uncopyable.h

class Uncopyable {
protected:
    Uncopyable() {}
    ~Uncopyable() {}

private:
    Uncopyable(const Uncopyable&);
        Uncopyable& operator=(const Uncopyable&);
};

Base.h

class Base : private Uncopyable
{
public:
    Base(int a);

    virtual ~Base();

private:
    int mValBase;
};

Base.cpp

Base::Base(int a)
    : mValBase(a)
{
}

Base::~Base()
{
}

Derived.h

class Derived : public Base
{
public:
    Derived(int a, int b);

    ~Derived();

private:
    int mValDerived;
};

Derived.cpp

Derived::Derived(int a, int b)
    : Base(a),
      mValDerived(b)
{
}

Derived::~Derived()
{
}

当我插入以下代码块(不是此处显示的所有代码)时

{
    std::shared_ptr<Derived> derived = std::shared_ptr<Derived>(new Derived(1, 2));
}

在代码块退出并破坏shared_ptr derived时,我发现堆损坏(“CRT检测到应用程序在堆缓冲区结束后写入内存”)。但是,如果我在mValDerived的构造函数中删除Derived的初始化,则不会发生堆损坏。此外,如果我在一个非常短的控制台应用程序中插入上述类和代码,我没有堆损坏。

任何人都可以帮助我了解问题是什么以及如何解决问题?我很茫然。

我正在使用VS2012。

1 个答案:

答案 0 :(得分:2)

我没有看到代码有任何问题。如果它在一个简短的控制台程序中工作,则错误可能在您程序的其他部分。您必须系统地检查程序的其他部分,直到错误消失为止。