C++ C++;:筛选节点值时崩溃

C++ C++;:筛选节点值时崩溃,c++,pointers,C++,Pointers,下面的代码模拟了我在项目代码中面临的一个问题。 在这段代码中,我有一个向量,其中有一些值。现在,我想根据一些条件从这个原始向量中过滤出一些值,并将它们存储在一个新的向量中 这里的主要捕获是“节点”中的指针变量。我甚至在做深度复制,以避免双重自由()。但即便如此,它也给出了同样的例外 守则: #include <iostream> #include <vector> using namespace std; class node { public: i

下面的代码模拟了我在项目代码中面临的一个问题。 在这段代码中,我有一个向量,其中有一些值。现在,我想根据一些条件从这个原始向量中过滤出一些值,并将它们存储在一个新的向量中

这里的主要捕获是“节点”中的指针变量。我甚至在做深度复制,以避免双重自由()。但即便如此,它也给出了同样的例外

守则:

#include <iostream>
#include <vector>

using namespace std;

class node
{
    public:

    int a;
    double *ptr;

    node()
    {
        a = 0;
        ptr = NULL;
    }

    ~node()
    {
        if(ptr)
        {
            delete [] ptr;
        }
    }
};

int main()
{
    vector <node> original(10);
    cout << "Filling values in Original Copy : " << endl ;

    for(int i=0; i<10; i++)
    {
        original[i].a = 0;
        original[i].ptr = new double[20];
    }

    vector <node> mod2;
    cout << "Finding Nodes with value mod 2 : "  << endl ;

    for(int i=0; i<10; i++)
    {
        if(original[i].a%2 == 0)
        {
            node temp;
            temp.a = original[i].a;

            // Deep Copy
            temp.ptr = new double[20];    
            for(int j=0; j<20; j++)
            {
                temp.ptr[j] = original[i].ptr[j];
            }

            mod2.push_back(temp);
            temp.ptr = NULL; // To avoid memory deallocation
        }        
    }


   return 0;
}
#包括
#包括
使用名称空间std;
类节点
{
公众:
INTA;
双*ptr;
节点()
{
a=0;
ptr=NULL;
}
~node()
{
如果(ptr)
{
删除[]ptr;
}
}
};
int main()
{
矢量原件(10);

cout每次您将and元素推入mod2向量时,它都会增加其大小。为此,它会破坏以前保存的内存,并为其分配一个新块。在这样做的同时,它会调用默认情况下执行浅拷贝的默认拷贝构造函数

您可以通过以下方式解决此问题:

  • 重载默认副本构造函数

  • 提前为mod2保留大小(您知道它不能大于原始向量)

    编辑:您还可以检查@NPE所指定的


  • 节点
    类违反了。您需要添加复制构造函数和复制赋值运算符

    没有这一点,只要复制了
    节点
    的实例(就像
    std::vector
    通常所做的那样),代码就会结束


    tmp
    添加到
    向量
    后,手动将
    temp.ptr
    设置为
    NULL
    有一定帮助。然而,这既不是一个干净的解决方案,也不是一个可靠的解决方案(因为在需要这样做时,它没有考虑所有情况).

    为什么不使用向量或一些std数据结构而不是
    ptr
    @UmNyobe:实际上,它是一个现有的代码。我只是在代码中添加一个新功能,这就是为什么我不能更改节点结构。为了避免这种情况,我正在执行
    temp.ptr=NULL;
    即使它正在崩溃。