C++ :过滤节点值时崩溃
C++ : Crashing while filtering the node values
下面的代码模拟了我在项目代码中遇到的一个问题。在此代码中,我有一个向量,其中我有一些值。现在,我想根据一些条件从这个原始向量中过滤掉一些值,并将它们存储在一个新向量中。
这里的主要问题是"节点"中的指针变量。我什至在做深度复制以避免双重自由()。但即便如此,它也给出了同样的例外。
代码:
#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;
}
node
类违反了三法则。您需要添加复制构造函数和复制赋值运算符。
如果没有这个,每当复制node
的实例时(就像std::vector<node>
通常所做的那样),你的代码最终会双重删除内存。
tmp
添加到vector
后手动将temp.ptr
设置为NULL
的技巧有所帮助。但是,这既不是一个干净的解决方案,也不是一个强大的解决方案(因为它不能在需要这样做时处理所有情况)。
每次将 和 元素推送到 mod2 向量中时,它都会增加其大小。为了做到这一点,它正在破坏以前持有的内存并为其分配一个新块。在这样做时,它正在调用默认的复制构造函数,默认情况下,该构造函数正在执行浅层复制。
您可以通过以下方式解决此问题:
-
重载默认复制构造函数
-
提前为 mod2 保留大小(如您所知,它不能大于原始矢量)
编辑:您还可以检查@NPE制定的三法则。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 反向给定链表中的K节点
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- Boost Graph Library,修复节点大小
- C++A*算法并不总是在路径中具有目标节点
- 程序崩溃并显示"std::out_of_range"错误
- 如何找到2个单链表的公共节点
- omnet++ 模拟在节点关闭时崩溃
- 在C++中实现二叉搜索树,搜索不起作用.尝试打印节点的元素会导致输出崩溃
- C++ :过滤节点值时崩溃
- 尝试将节点添加到链表时程序崩溃
- 尝试将元素添加到现有节点时程序崩溃
- 尝试将节点插入矢量<node>,但程序在push_back时不断崩溃
- c++删除节点链表导致程序崩溃
- 查找节点崩溃的函数
- 我的单链表中的一个函数(在找到特定节点后添加新节点)使我的程序崩溃
- 删除循环列表中的节点时崩溃
- 当我试图在远程Linux节点上更改Eclipse中的设置时,X服务器崩溃了