0

那个 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;  
}  
4

3 回答 3

8

如果在这些数组上插入对象指针(最初将它们初始化为 NULL),则需要迭代它们以删除每个单个对象。

与往常一样,一个删除一个新的。

于 2010-05-21T14:05:58.537 回答
4

黄金法则是每次调用 new 时都必须调用 delete 一次。如果你只调用一次 new 来构造数组,你只需要调用一次 delete 来销毁它。

如果您在将项目添加到列表之前对项目调用 new 并忘记了该项目,则您必须在析构函数中对这些项目调用 delete 。

上面你正在初始化一个指针数组,每个指针只有 4 个字节将被正确释放。

我通常在我的代码中跟踪每个项目的责任,如果你将一个项目添加到列表中,列表是否会接管该对象的责任?如果你有类似新项目的东西,将它添加到列表中并销毁指向新对象的指针,只留下对它的引用,然后列表必须接管清理内存的责任,它必须迭代项目并一一释放它们。

于 2010-05-21T14:11:43.927 回答
0

对处理指针的数组使用现成的容器。很少需要自己动手,如果有的话,可以对其进行概括,以便可以重复使用。

于 2010-05-21T14:17:20.963 回答