0

そのデストラクタで十分ですか、それとも新しいノードを削除するために反復する必要がありますか??

#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 に初期化しています)、それらを反復処理して各オブジェクトを削除する必要があります。

いつものように、新しいものごとに 1 つの削除。

于 2010-05-21T14:05:58.537 に答える
4

ゴールデン ルールは、new を呼び出すたびに delete を 1 回呼び出す必要があるということです。new を 1 回だけ呼び出して配列を構築する場合は、delete を 1 回だけ呼び出して破棄する必要があります。

アイテムをリストに追加する前に new を呼び出し、そのアイテムを忘れた場合は、デストラクタでも delete を呼び出す必要があります。

上記では、ポインターの配列を初期化していますが、ポインターごとに 4 バイトのみが正しく解放されます。

私は通常、コード内の各項目の責任を追跡します。項目をリストに追加した場合、リストはオブジェクトの責任を引き継ぎますか? 新しいアイテムのようなものがある場合、それをリストに追加し、新しいオブジェクトへのポインターを破棄し、それへの参照を持つリストのみを残します。リストはメモリのクリーニングの責任を引き継ぐ必要があり、それはアイテムを繰り返し、1 つずつ解放します。

于 2010-05-21T14:11:43.927 に答える
0

ポインターを処理する配列には、既製のコンテナーを使用します。独自に作成する必要はめったにありません。必要な場合は、再利用できるように一般化してください。

于 2010-05-21T14:17:20.963 に答える