C++ 销毁共享\u ptr时堆损坏

C++ 销毁共享\u ptr时堆损坏,c++,visual-studio-2012,C++,Visual Studio 2012,考虑以下示例代码: 不可压缩的 类不可压缩{ 受保护的: 不可压缩(){} ~Uncopyable(){} 私人: 不可压缩(const不可压缩&); 不可压缩&运算符=(常量不可压缩&); }; Base.h 类基:私有不可压缩 { 公众: 基础(INTA); 虚拟~Base(); 私人: 内切酶; }; Base.cpp Base::Base(int a) :mValBase(a) { } Base::~Base() { } 导出的.h 派生类:公共基 { 公众: 导出(int a,i

考虑以下示例代码:

不可压缩的

类不可压缩{
受保护的:
不可压缩(){}
~Uncopyable(){}
私人:
不可压缩(const不可压缩&);
不可压缩&运算符=(常量不可压缩&);
};
Base.h

类基:私有不可压缩
{
公众:
基础(INTA);
虚拟~Base();
私人:
内切酶;
};
Base.cpp

Base::Base(int a)
:mValBase(a)
{
}
Base::~Base()
{
}
导出的.h

派生类:公共基
{
公众:
导出(int a,int b);
~Derived();
私人:
int-mValDerived;
};
导出的.cpp

Derived::Derived(inta,intb)
:基底(a),
mValDerived(b)
{
}
派生::~派生()
{
}
插入以下代码块时(并非此处显示的所有代码)

{
std::shared_ptr derived=std::shared_ptr(新派生的(1,2));
}
当代码块退出并销毁共享的_ptr
派生的
时,我得到一个堆损坏(“CRT检测到应用程序在堆缓冲区结束后写入内存”)。但是,如果我在
Derived
的构造函数中删除
mValDerived
的初始化,则不会出现堆损坏。此外,如果我在一个非常短的控制台应用程序中插入上述类和代码,则不会出现堆损坏

有人能帮我理解问题是什么以及如何解决它吗?我不知所措


我正在使用VS2012。

我看不出代码有任何错误。如果它在短控制台程序中工作,那么错误可能在程序的其他部分。你必须系统地检查程序的其他部分,直到错误消失。

virtual~Uncopyable(){}?@Eugene,除非他持有
Uncopyable*
static类型的指针——这将是一件奇怪的事情——那里不需要虚拟析构函数。比较一下boost::noncopyable,它同样有一个非虚拟析构函数。感谢您确认代码没有问题。我一直在修改和分析上面的类,因为调试器在那里告诉我出了问题,尽管我也看不出代码有什么问题,这让我发疯。在删除了程序中一段又一段的其他代码后,我找到了问题所在:在一个结构定义中,我用
#pragma pack
重新定义了打包对齐方式,之后没有将其“弹出”回以前的打包模式。这破坏了规范要求的填料对齐。