Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
灵魂破碎的C++;std::vector::resize()访问冲突错误 类SimpleVariant { 公众: SimpleVariant(){/*…*/}; // ... }; 结构变量块 { int nRows,nCols; 矢量数据; }; void dumb函数(VariantBlock&theBlock、int nRows、int nCols) { // ... CUT我最近不得不升级一些最初为Visual C++ 6编写的代码。代码有问题,因为VC++ 6没有处理正确绑定到引用的东西。这是一个在黑暗中的镜头,但是你是通过 const VariantBlock 到 DimbFooe?在C++规则下,那将是病态的。egal,但我强烈怀疑VC++6会弄错_C++_Resize_Access Violation_Stdvector - Fatal编程技术网

灵魂破碎的C++;std::vector::resize()访问冲突错误 类SimpleVariant { 公众: SimpleVariant(){/*…*/}; // ... }; 结构变量块 { int nRows,nCols; 矢量数据; }; void dumb函数(VariantBlock&theBlock、int nRows、int nCols) { // ... CUT我最近不得不升级一些最初为Visual C++ 6编写的代码。代码有问题,因为VC++ 6没有处理正确绑定到引用的东西。这是一个在黑暗中的镜头,但是你是通过 const VariantBlock 到 DimbFooe?在C++规则下,那将是病态的。egal,但我强烈怀疑VC++6会弄错

灵魂破碎的C++;std::vector::resize()访问冲突错误 类SimpleVariant { 公众: SimpleVariant(){/*…*/}; // ... }; 结构变量块 { int nRows,nCols; 矢量数据; }; void dumb函数(VariantBlock&theBlock、int nRows、int nCols) { // ... CUT我最近不得不升级一些最初为Visual C++ 6编写的代码。代码有问题,因为VC++ 6没有处理正确绑定到引用的东西。这是一个在黑暗中的镜头,但是你是通过 const VariantBlock 到 DimbFooe?在C++规则下,那将是病态的。egal,但我强烈怀疑VC++6会弄错,c++,resize,access-violation,stdvector,C++,Resize,Access Violation,Stdvector,另一种可能是某种运行时不匹配。如果(1)在一个模块中分配了VariantBlock,并且(2)dumbFunction来自不同的模块,和(3)它们是使用不同的设置编译的,可能是编译器的不同版本,那么您将看到这种行为(调整大小()分配新内存,将所有内容复制到其中,然后去释放旧内存,但旧内存是在不同的运行时分配的,因此程序会死机) P>简而言之,你所发布的代码是完全正确的。还有其他事情发生。 < P>我最近必须升级一些最初为Visual C++ 6编写的代码。代码有问题,因为VC++ 6没有处理正

另一种可能是某种运行时不匹配。如果(1)在一个模块中分配了
VariantBlock
,并且(2)
dumbFunction
来自不同的模块,(3)它们是使用不同的设置编译的,可能是编译器的不同版本,那么您将看到这种行为(调整大小()分配新内存,将所有内容复制到其中,然后去释放旧内存,但旧内存是在不同的运行时分配的,因此程序会死机)


<> P>简而言之,你所发布的代码是完全正确的。还有其他事情发生。

< P>我最近必须升级一些最初为Visual C++ 6编写的代码。代码有问题,因为VC++ 6没有处理正确绑定到引用的代码。这是一个在黑暗中的尝试,但是你是否在<代码>中通过了。在C++规则下,这是非法的,但我强烈地怀疑VC++ 6会出错。 另一种可能是某种运行时不匹配。如果(1)在一个模块中分配了
VariantBlock
,并且(2)
dumbFunction
来自不同的模块,(3)它们是使用不同的设置编译的,可能是编译器的不同版本,那么您将看到这种行为(调整大小()分配新内存,将所有内容复制到其中,然后去释放旧内存,但旧内存是在不同的运行时分配的,因此程序会死机)


简而言之,您发布的代码非常好。还有其他一些问题。

我认为您在出错之前做了一些错误。
std::vector::resize
操作将要求内存,堆很容易受到损坏。未定义行为的缺点是,症状可能会在一分钟内变得可见lion在错误后执行的指令(即“任何事情都可能发生”包括“没有”)

我们有一个“调试内存管理器”,它重新定义了全局分配器,可以对损坏进行大量检查:

  • 用不明显的位模式初始化分配的内存(当有人使用未初始化的内存时,这是为了发现问题,当找到零时,代码显然可以工作)
  • 在每个内存块之前和之后添加一些“安全区域”,并在删除时检查它是否未被覆盖(这用于缓冲区溢出检测)
  • 释放时使用不同的特定模式填充内存(这是为了尝试捕获删除错误后的读取)
  • 重用内存块,并在重新分配或全局验证时检查已删除的内存模式是否仍然存在(这是为了捕获删除后的写入错误)
  • 使用
    \uuuuu FILE\uuuu/\uuuuuu LINE\uuuu
    信息标记每个块,以检测谁在泄漏内存泄漏,并能够辨别谁在使用删除后损坏的块
  • 此外,我们还有一个内存检查例程,可以根据需要遍历所有内存块并检查一致性(通常我们只检查分配/解除分配)。我们还可以注销所有内存分配/解除分配的完整列表,以备不时之需


    不幸的是,对于点(5),C++的语法是很难理解的,所以我们实际上不使用<代码>新< /COD>而是一个<代码> xNeX//COD>宏,它最终扩展成一个布局分配;这也意味着我们不能检测在标准库内分配的内存块。(但是,我们存储在库中进行分配之前在程序中进行分配的最后一个源代码行是什么).

    我认为您在该错误之前犯了一些错误。
    std::vector::resize
    操作将要求内存,堆很容易损坏。未定义行为的缺点是,在错误发生后,症状会变得可见,执行了一百万条指令(即“任何事情都可能发生”)“没什么”)

    我们有一个“调试内存管理器”,它重新定义了全局分配器,可以对损坏进行大量检查:

  • 用不明显的位模式初始化分配的内存(当有人使用未初始化的内存时,这是为了发现问题,当找到零时,代码显然可以工作)
  • 在每个内存块之前和之后添加一些“安全区域”,并在删除时检查它是否未被覆盖(这用于缓冲区溢出检测)
  • 释放时使用不同的特定模式填充内存(这是为了尝试捕获删除错误后的读取)
  • 重用内存块,并在重新分配或全局验证时检查已删除的内存模式是否仍然存在(这是为了捕获删除后的写入错误)
  • 使用
    \uuuuu FILE\uuuu/\uuuuuu LINE\uuuu
    信息标记每个块,以检测谁在泄漏内存泄漏,并能够辨别谁在使用删除后损坏的块
  • 此外,我们还有一个内存检查例程,可以按需遍历所有内存块并检查一致性(通常我们只检查分配/解除分配)。我们还可以注销所有内存分配/解除分配的完整列表,以便执行DISP
    class SimpleVariant
    {
    public:
        SimpleVariant()  { /*...*/ };
        // ...
    };
    
    
    struct VariantBlock
    {
        int nRows, nCols;
        vector<SimpleVariant> theData;
    };
    
    
    
    void dumbFunction( VariantBlock& theBlock, int nRows, int nCols )
    {
        // ...
        cout << "theBlock.nRows= " << theBlock.nRows 
             << ", theBlock.nCols= " << theBlock.nCols
             << ", theBlock.theData.size() " << theBlock.theData.size();
    
        theBlock.theData.resize( nRows * nCols );   
           // throws Access Violation Exception
    
        // ...
    }