0
vector<ClassX> xVec;

if (inputFile.peek() == '$')
{
    classX classXInstance;           //<==================== local instantiation
    readFileElements(classXInstance);//<== pass by reference
    if(classXInstance.validate())
    {
       xVec.push_back(classXInstance);///<=============== added here
    }
    /// destructor of the local copy is called here
}

我得到了一个核心转储,试图调试,但是我用 gdb 得到了这么多垃圾消息,我只能看到向量被破坏了,不确定是不是因为调用了析构函数是一个原因?

编辑:

我的课看起来像这样

class ClassX
{
 public:
    ClassX() { numberOfX=0; ppXX = NULL; };
   ~ClassX();
   void validate();
   char **setX(const vector<string>& Xss);
   inline char **getX() {return ppXX;};
 private:
    int numberOfX;
    char **ppXX;
};

它包含一个析构函数如下

ClassX::~ClassX()
{
    if (ppXX != NULL)
    {
        for(int i=0; i < numberOfXX; i++)
        {
            if (ppXX[i] != NULL)
            {
                delete [] ppXX[i];
                ppXX[i] = NULL;
            }
        }

        // Free array of pointers.
        delete [] ppXX;
        ppXX = NULL;
    }
}

setX 分配所有必要的内存

验证给我一个 ppXX[i] 的打印输出,如果元素的数量与字符串向量的大小匹配,则返回 true

4

1 回答 1

1

的副本classXinstance存储到xVec中,并带有指向ppXX内存中某个区域的指针。现在你有两个指向同一个区域的对象。片刻之后,classXinstance被摧毁,因此该区域受制于delete。xVec 中的元素现在指向无效内存。

最好的选择是使用std::Vector<std::string>而不是char **ppXX; 字符串向量负责引用和分配,因此您无需担心正确的构造/复制/销毁。

于 2013-08-21T14:23:14.157 回答