灵魂破碎的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会弄错
另一种可能是某种运行时不匹配。如果(1)在一个模块中分配了灵魂破碎的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没有处理正
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
信息标记每个块,以检测谁在泄漏内存泄漏,并能够辨别谁在使用删除后损坏的块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
// ...
}