考虑以下示例代码:
无法复制
class Uncopyable {
protected:
Uncopyable() {}
~Uncopyable() {}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};
基数
class Base : private Uncopyable
{
public:
Base(int a);
virtual ~Base();
private:
int mValBase;
};
Base.cpp
Base::Base(int a)
: mValBase(a)
{
}
Base::~Base()
{
}
派生
class Derived : public Base
{
public:
Derived(int a, int b);
~Derived();
private:
int mValDerived;
};
派生文件
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。
最佳答案
我没有发现任何代码错误。如果它在简短的控制台程序中有效,则该错误可能是在程序的其他部分。您将必须系统地检查程序的其他部分,直到错误消失。