4

std::set配列内の各要素の機能が必要です。この機能を実現するにはどうすればよいですか?

次のように、C++ で設定された std の動的配列を割り当てることから始めました。

set<int>* entry;

続いて割り当て:

entry = (set<int>*)malloc(sizeof(set<int>)*32);

コンパイルに問題はありませんが、要素にアクセスするとランタイムがセグメンテーション違反で失敗します。

entry[0].insert(23);

どんな助けでも大歓迎です。

4

5 に答える 5

11

どうですか

#include <set>
#include <vector>

int main()
{
        std::vector < std::set<int> > entry(32); // std::vector constructor makes 32 calls to std::set<int> constructor
        entry[0].insert(23);
        // std::vector destructor makes 32 calls to std::set<int> destructor
}
于 2012-07-04T11:30:19.093 に答える
5

C++ では、 でメモリを割り当てますnew。ここでの malloc との違いは、メモリを初期化するためにコンストラクタが呼び出されることです。

entry = new set<int>[32];
于 2012-07-04T11:30:01.367 に答える
4

32 のストレージを割り当てても、std::setこのメモリ範囲を初期化していません (つまり、のコンストラクタstd::setが呼び出されていません)。したがって、操作/アクセスしようとしているメモリは未定義の動作entry[0].insert (23)を引き起こします。 .

C++ オブジェクトを と と同等のものと混在させることは、通常 (" alwaysmalloc "と書きたくなる) 悪い習慣と見なされます。

代わりに、メモリoperator newを割り当てて適切な方法でオブジェクトの構築を処理するのに目を向けます。また、メモリを解放してシステムに戻すために割り当てられたメモリを覚えておいてdeleteください (そして、オブジェクトを真の方法で破壊します)。


C ++でそれを行う適切な方法

一部の回答には、 を使用した方がよいというテキストが含まれますがstd::vector<std::set>、それは実際には質問に対する回答ではないため、この例のスニペットを残します。

int
main (int argc, char *argv[])
{
  std::set<int> *entries = new std::set<int> [32]; 

  entries[0].insert (123);

  delete [] entries;
}
于 2012-07-04T11:34:12.987 に答える
2

これは良い質問ですが、その答えはすぐにはわかりません。問題は、各setオブジェクトを使用する前に初期化する必要があることですが、コードでは各オブジェクトに生のメモリしか割り当てられませんset。これで修正されます:

#include <vector>
#include <set>

using std::vector;
using std::set;

const int N = 32;

int main() {
    vector< set<int> > entry(N);
    entry[0].insert(23);
    return 0;
}
于 2012-07-04T11:37:23.353 に答える
1

C++クラスでmalloc/calloc/reallocなどを使用しないでください。newを使用します。

于 2012-07-04T11:31:05.047 に答える