C++ 复制向量和代码将转到_CrtIsValidHeapPointer()

C++ 复制向量和代码将转到_CrtIsValidHeapPointer(),c++,visual-c++,C++,Visual C++,我声明了以下类型的向量: vector<CDFE> vDFE; 我正在创建一个温度向量,如下所示,因为我不想修改vDFE vector<CDFE> tempDFE(pDoc->vDFE); 我不确定pDoc->DFE在做什么。你的意思是不是pDoc->vDFE 调试消息发出内存问题的信号 你确定向量的大小了吗?比如说, vector<CDFE> vDFE(10); 矢量vDFE(10); 这将创建一个带有10个默认构造CFDE的向量 请确保我的大

我声明了以下类型的向量:

vector<CDFE> vDFE;
我正在创建一个温度向量,如下所示,因为我不想修改
vDFE

vector<CDFE> tempDFE(pDoc->vDFE);

我不确定
pDoc->DFE
在做什么。你的意思是不是
pDoc->vDFE

调试消息发出内存问题的信号

你确定向量的大小了吗?比如说,

vector<CDFE> vDFE(10);
矢量vDFE(10);
这将创建一个带有10个默认构造CFDE的向量


请确保我的大小不超过9。

该错误是由于内存损坏造成的。 在类对象中使用vector而不使用任何类型的复制构造函数通常是个坏主意。在这种情况下,相同的内存地址可能会被释放几次;可能导致内存损坏

现在可能还有其他可能的问题,例如,如果您将其构建为DLL,那么也可能会出现一些堆损坏,具体取决于您如何将代码与其他模块/应用程序链接

希望这有帮助,
关于。

由于许多可能的原因,损坏堆从来没有那么困难。首先看一看三的规则,确保你在你的CDFE类上应用了它,并且它的复制构造函数和赋值操作符都是可靠的。它在那里会产生错误吗?我相信这个函数只是检查指针是否有效。哪一行触发了这个行为?你能一步一步地使用调试器,看看到底是哪一行导致你的程序出错吗?如果你不知道规则,那么你一定会打破它;)只需谷歌“c++规则三”,前两个点击就可以了。能否
GetDocument()
返回
NULL
?您可以发布
GetDocument()
的代码吗?我已经将vDFE的大小调整为100,但最大值不超过60。我需要更多信息。“我不确定pDoc->DFE在做什么。你不是说pDoc->vDFE吗?”。你能包括CDFE声明吗?我现在已经包括了声明。需要如上所述的最小完整示例。在此期间,您可以尝试进行全面重建。您可能只是有陈旧的编译单元。谢谢您的回复。它不是DLL。如何解决复制构造函数的问题?再次感谢选中链接部分:我什么时候需要编写副本构造函数?您是否正在执行任何可能导致问题的操作?顺便问一下,这是一个独立的应用程序吗?原因静态链接库(不仅仅是dll)也可能发生堆损坏。
class CDFE : public CRect
{
    public:
        CDFE();
        virtual ~CDFE();
        double usage;
}


void CRXView::OnDraw(CDC* pDC)
{
    CRXDoc* pDoc = GetDocument();
    vector<CDFE> tempDFE(pDoc->vDFE);
}

CRXDoc* CRXView::GetDocument() const // non-debug version is inline
{
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRXDoc)));
    return (CRXDoc*)m_pDocument;
}
vector<CDFE> vDFE(10);