Как очистить (деструктор) динамический массив указателей? - PullRequest
0 голосов
/ 21 мая 2010

Достаточно ли этого Деструктора или мне нужно выполнить итерацию, чтобы удалить новые узлы?

#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 ]

7 голосов
/ 21 мая 2010

Если вы вставили указатели объектов в эти массивы (изначально вы инициализируете их в NULL), вам нужно будет повторить их, чтобы удалить каждый отдельный объект.

Как всегда, одно удаление для каждого нового.

2 голосов
/ 21 мая 2010

Золотое правило заключается в том, что вы должны вызывать delete один раз за каждый вызов, который вы вызывали new. Если вы вызываете new только один раз для создания массива, вам нужно вызвать delete только один раз, чтобы уничтожить его.

Если вы вызываете новый элемент, прежде чем добавить его в список, и забываете об элементе, который вы должны вызвать, удалите его и в деструкторе.

Выше вы инициализируете массив указателей, и только 4 байта на указатель будут освобождены правильно.

Обычно я отслеживаю ответственность каждого элемента в своем коде. Если вы добавляете элемент в список, берет ли список ответственность за этот объект на себя? Если у вас есть что-то вроде нового элемента, добавьте его в список и уничтожьте указатель на новый объект, оставив только список со ссылкой на него, тогда список должен взять на себя ответственность за очистку памяти, и ему придется повторяйте предметы и освобождайте их один за другим.

0 голосов
/ 21 мая 2010

Используйте готовый контейнер для массивов, которые обрабатывают указатели.Редко возникает необходимость свернуть свою собственную, и если есть случайность, обобщите ее, чтобы ее можно было использовать повторно.

...