1

由于一些疯狂,我被迫在全新安装的 Win7 Pro 上升级到 Microsoft Visual Studio 2010 Ultimate。我已将代码简化为结构的基本结构以及一般情况。我听说这可能是 VS2010 在他们的 STL 实现中的一个错误,如果是这样,我正在寻找解决方法。(编辑:我的原始代码在 Visual Studio 2008 中运行良好。)

这是头文件:

#include <iostream>
#include <vector>
using namespace std;

class ChildClass    //partition function for each
{
public:
    ChildClass();
    void Clear(void);
    vector<double> childrenvars;
    void PrintChildren(void);
    //long list of other variables
};
class ParentClass
{
    public:
    ChildClass variable;
    //other variables
    ParentClass();
    ~ParentClass();
};

这是源文件:

#include "source.h"

ChildClass::ChildClass()
{
    Clear();
}
void ChildClass::Clear(void)
{
    childrenvars.clear();
    return;
}
void ChildClass::PrintChildren(void)
{
    cout << endl;
    for(unsigned int i=0; i<childrenvars.size(); i++)
        cout << childrenvars[i] << " ";
}
ParentClass::ParentClass()
{
    this->~ParentClass();
}
ParentClass::~ParentClass()
{
    this->variable.childrenvars.clear();
}

int main(void)
{
    ParentClass* ParVar = new ParentClass[5];
    for(unsigned int numiter = 0; numiter < 3; numiter++)
    {
        for(unsigned int i=0; i<5; i++)
        {
            for(unsigned int j=0; j<i; j++)
                ParVar[i].variable.childrenvars.push_back(j);
            ParVar[i].variable.PrintChildren();
        }
        for(unsigned int i=0; i<5; i++)
            ParVar[i].variable.Clear();
    }
    delete [] ParVar;
    int wait;
    std::cin >> wait;
    return(0);
}

在发行版中编译提供了可预测的功能:

(blank)
0
0 1
0 1 2
0 1 2 3

0
0 1
0 1 2
0 1 2 3

0
0 1
0 1 2
0 1 2 3

在调试模式下编译给出:

(blank)
0
0 1
0 1 2
0 1 2 3

Debug Assertion Failed... vector iterators incompatible.

它在第一次调用.Clear()函数时失败。即使将 clear for 循环更改为从 1,2 等开始,也会发生这种情况。错误似乎是由于 .clear() 调用 .erase(begin(), end()) 而导致的。当向量中没有任何东西并且它已经是空的时,它真的很讨厌它。有趣的是,当清除循环在擦除(const_iterator _First_arg,const_iterator_Last_arg)中从 2 开始时,这是我在 autos 下看到的内容。

_First_arg = 0,正如预期的那样。

_Last_arg = -2.53...e-098

这:

尺寸:2

容量:2

0:0.0000...

1:1.000....

第一个向量开始于:0x002648e8 最后一个向量开始于:0x002648f8(虽然我认为由于 end(),这实际上是最后一个向量之外的一个,这对于 8 字节双精度数是有意义的)。

除了转到预处理器定义并设置 _ITERATOR_DEBUG_LEVEL=0 以关闭这些“功能”(我实际上想知道我是否不小心搞砸了)之外,任何人都对实际原因是什么以及如何解决这个问题有任何想法? 虽然我确实有一些多余的清除,但我不认为这会是这个问题的根源。尤其是考虑到代码甚至从未到达析构函数。

提前致谢!

~丹

4

2 回答 2

2
ParentClass::ParentClass()
{
    this->~ParentClass();
}

析构函数不是普通函数,它是特殊函数。如果你在一个对象上调用析构函数,它会被完全销毁,包括它的所有基类和成员。在这里,您将在ParentClass对象完全构造之前将其销毁。任何使用该对象的尝试都可能导致问题,例如您看到的错误消息所标记的问题。

如果你想在析构函数和另一个函数之间共享代码,你应该把代码放在一个单独的函数中,并从析构函数和另一个函数中调用它。在几乎所有应用程序代码中,您永远不需要显式调用析构函数。

std::vector默认情况下构造为空并在销毁时清理,因此ChildClass构造函数和ParentClass构造函数和析构函数在您的示例中都是多余的,可以省略。

于 2012-04-12T06:39:00.583 回答
1

不确定这里的意图是什么,但如果你删除this->~ParentClass();它就可以了。

于 2012-04-12T03:29:49.643 回答