3

だから、私はこのコードを持っていてppint、最後に配列の割り当てを解除しようとしています。Xcodeでリークを使用して動作しているかどうかを調べてみましたが、よくわかりません。これは機能しますか?

delete ppint[0];
delete ppint[1];
delete ppint[2];
delete ppint[3];

それとも他にやらなければならないことがありますか?

#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;

int main()
{
    int **ppint;
    ppint = new int * [4];

    for(int i = 0; i < 4; i++ ) {
        ppint [i] = new int[4];
    } // declares second layer of arrays

    for(int i = 0, count = 0; i < 4; i++ ) {
        for(int j = 0; j < 4; j++ ) {
            count++;
            ppint [i] [j] = count;
        } //init part 2
    } // init array

    for(int i = 0; i < 4; i++ ) {
        for(int j = 0; j < 4; j++ ) {
            cout << ppint [i] [j] << endl;
        } // print part 2
    } //print array
}
4

5 に答える 5

6

近い。delete[]それぞれに次のものを割り当てたため、使用する必要がありnew[]ます。

delete[] ppint[0];
delete[] ppint[1];
delete[] ppint[2];
delete[] ppint[3];

しかしもちろん、ループを使用する必要があります。

for(int i = 0; i < 4; i++ ) {
  delete[] ppint[i];
}

delete[] ppintそして、それ自体を忘れないでください:

delete[] ppint;

ただし、C++ では、動的に割り当てられた配列をいじらないことを好みます。std::vector<std::vector<int>>またはを使用しstd::array<std::array<int, 4>, 4>ます。データの局所性が気になる場合は、 を試してくださいboost::multi_array

于 2013-02-18T20:53:34.110 に答える
2

私の解決策は次のとおりです。

#include<iostream>
#include<cstdlib>

using namespace std;

int main(){

    int ** twod;
    twod = new int*[4];
    int counter = 0;
    /*init 2d variable and check whether we got the memory*/
    if ( twod == NULL) {
        exit(EXIT_FAILURE);
    }
    for (unsigned i = 0; i< 4; i++){
        /**/
        twod[i] = new int[4];
        if (twod[i] == NULL){
            exit(EXIT_FAILURE);
        }
        for (unsigned j = 0; j < 4; j++){
            counter++;
            twod[i][j]=counter;
        }
    }

    for ( unsigned i = 0; i < 4; i++){
        for (unsigned j = 0; j < 4; j++){
            cout << twod[i][j] << endl ;
        }
    }

    for (unsigned i = 0; i < 4; i++)
        delete [] twod[i];

    /*and don't forget to delete the int* array as well.*/
    delete [] twod;

}

メモリエラーが発生していないことを確認したい場合は、valgrind も使用してください。

Valgrind は、メモリ エラーを検出するための優れたツールです。出力では、すべて解放された 5 つのメモリ割り当てを行ったことを示しています。Valgrind は、まったく割り当てていないメモリの使用など、他の種類のメモリ エラーを表示することもできます。私が言ったように、使用前に適切に初期化されていないメモリを使用しています 優れたメモリチェックツール.

$ valgrind ./a.out
==18376== Memcheck, a memory error detector
==18376== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==18376== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==18376== Command: ./a.out
==18376== 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
==18376== 
==18376== HEAP SUMMARY:
==18376==     in use at exit: 0 bytes in 0 blocks
==18376==   total heap usage: 5 allocs, 5 frees, 96 bytes allocated
==18376== 
==18376== All heap blocks were freed -- no leaks are possible
==18376== 
==18376== For counts of detected and suppressed errors, rerun with: -v
==18376== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

もちろん、他の人が std::vector を利用すると言っているように、たとえば、c ではなく c++ でコーディングしています。

于 2013-02-18T21:16:10.670 に答える
1

delete以前の呼び出しごとに1つの呼び出しが必要ですnew

for(int i = 0; i < 4; i++ ) {
    delete[] ppint[i];
}
delete[] ppint;
于 2013-02-18T20:54:51.513 に答える
1

それ自体が指すメモリを削除する必要がありppintます。delete[]and notも使用する必要がありますdelete

ただし、手動配列よりも標準コンテナーを優先してください。

std::vector< std::vector<int> > iv; // dynamic size
std::array< std::array<int,4>, 4> ia; // static size
于 2013-02-18T20:53:47.540 に答える
1

で割り当てられたものnew[]は、 で割り当てを解除する必要がありますdelete[]。ただしstd::vector、生の配列とnew. 自動的にメモリを管理します。


以下は元のコードを直接エミュレートし、より短く、よりクリーンで安全です。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<vector<int>> v( 4, vector<int>( 4 ) );

    for( int i = 0, count = 0; i < 4; ++i ) {
        for( int j = 0; j < 4; ++j ) {
            ++count;
            v[i][j] = count;
        }
    }

    for( int i = 0; i < 4; ++i ) {
        for( int j = 0; j < 4; ++j ) {
            cout << v[i][j] << endl;
        }
    }
}

C++ の精神により、再利用可能なマトリックス クラスを定義できます/定義する必要があります。

#include <iostream>
#include <vector>
using namespace std;

template< class item_t >
class matrix_
{
private:
    vector<item_t>  items_;
    int             width_;
    int             height_;

    int index_for( int const x, int const y ) const
    {
        return y*width_ + x;
    }

public:
    item_t const& operator()( int const x, int const y ) const
    {
        return items_[index_for( x, y )];
    }

    item_t& operator()( int const x, int const y )
    {
        return items_[index_for( x, y )];
    }

    matrix_( ssize_t const w, ssize_t const h )
        : items_( w*h )
        , width_( w )
        , height_( h )
    {}
};

int main()
{
    matrix_<int> m( 4, 4 );

    for( int i = 0, count = 0; i < 4; ++i ) {
        for( int j = 0; j < 4; ++j ) {
            ++count;
            m( j, i ) = count;
        }
    }

    for( int i = 0; i < 4; ++i ) {
        for( int j = 0; j < 4; ++j ) {
            cout << m( j, i ) << endl;
        }
    }
}
于 2013-02-18T20:53:47.743 に答える