如何清理(析构函数)一个动态的指针数组?

时间:2010-05-21 14:03:14

标签: c++ oop pointers destructor dynamic-arrays

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;  
}  

3 个答案:

答案 0 :(得分:7)

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

与往常一样,每次删除都会删除一次。

答案 1 :(得分:2)

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

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

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

我通常会跟踪代码中每个项目的责任,如果您将项目添加到列表中,列表是否会接管对象的责任?如果您有类似new的项目,将其添加到列表中并销毁指向新对象的指针,只留下带有对它的引用的列表,那么列表必须接管清理内存的责任,它必须迭代这些项目并逐一释放它们。

答案 2 :(得分:0)

为处理指针的数组使用现成的容器。很少需要自己动手,如果有的话,那么就可以将其概括为可以重复使用。