Destructor是否已足够或者我必须迭代删除新节点吗?
#include "stdafx.h"
#include<iostream>
using namespace std;
struct node{
int row;
int col;
int value;
node* next_in_row;
node* next_in_col;
};
class MultiLinkedListSparseArray {
private:
char *logfile;
node** rowPtr;
node** colPtr; // used in constructor
node* find_node(node* out);
node* ins_node(node* ins,int col);
node* in_node(node* ins,node* z);
node* get(node* in,int row,int col);
bool exist(node* so,int row,int col);
//add anything you need
public:
MultiLinkedListSparseArray(int rows, int cols);
~MultiLinkedListSparseArray();
void setCell(int row, int col, int value);
int getCell(int row, int col);
void display();
void log(char *s);
void dump();
};
MultiLinkedListSparseArray::MultiLinkedListSparseArray(int rows,int cols){
rowPtr=new node* [rows+1];
colPtr=new node* [cols+1];
for(int n=0;n<=rows;n++)
rowPtr[n]=NULL;
for(int i=0;i<=cols;i++)
colPtr[i]=NULL;
}
MultiLinkedListSparseArray::~MultiLinkedListSparseArray(){ // is that destructor enough??
cout<<"array is deleted"<<endl;
delete [] rowPtr;
delete [] colPtr;
}
答案 0 :(得分:7)
如果在这些数组上插入对象指针(最初将它们初始化为NULL),则需要迭代它们以删除每个单个对象。
与往常一样,每次删除都会删除一次。
答案 1 :(得分:2)
黄金法则是每次调用new时都必须调用一次delete。如果你只调用new一次构造数组,你只需要调用delete一次就可以销毁它。
如果在将项目添加到列表之前调用new,并忘记该项目,则必须在析构函数中调用delete。
上面你正在初始化一个指针数组,每个指针只有4个字节将被正确释放。
我通常会跟踪代码中每个项目的责任,如果您将项目添加到列表中,列表是否会接管对象的责任?如果您有类似new的项目,将其添加到列表中并销毁指向新对象的指针,只留下带有对它的引用的列表,那么列表必须接管清理内存的责任,它必须迭代这些项目并逐一释放它们。
答案 2 :(得分:0)
为处理指针的数组使用现成的容器。很少需要自己动手,如果有的话,那么就可以将其概括为可以重复使用。