2016-10-27 14 views
-1

私はこれがあなたの問題である構造内のベクターにアクセスするには?

#include<vector> 
#include<iostream> 
#include<stdlib.h> 

using namespace std; 

struct Hello{ 
    vector<int>vec ; 
}; 

struct Hello *h[1][1]; 

int main() 
{ 
    struct Hello *v = (struct Hello *)malloc(sizeof(struct Hello)); 
    h[0][0]=v; 
    0][0]->vec.push_back(13); 
    //How to add 13 to vector vec? 
    //It shows an error. But why? 
    cout<<h[0][0]->vec.at(0)<<endl; 
    return 0; 
} 
+0

C++で 'malloc'を使用しないでください、' new'を使用してください –

+2

理想的には新しい – CashCow

答えて

3

の下に定義されている構造体の内部のベクトルにアクセスする方法を知りたい:

struct Hello *v = (struct Hello *)malloc(sizeof(struct Hello)); 

(余談、structは、それが中に使用されたたびに不必要であるとして

Helloの領域を割り当てますが、構成しません。
Helloのメンバにはstd::vectorが1つあり、ctorの呼び出しが省略されているので、自明ではありません。

いずれかを使用プレースメント新へのインプレースHello、またはより良い構築まだ割り当て、1コンストラクトは、C++の道を行く:

Hello *v = new Hello; 
// andd later deallocate 
delete v; 

ベスト、ちょうど完全に動的な割り当てを避ける:

Hello h; 

メンバーアクセス.またはポインタ->を使用します。

1

これは、C++でのコードの記述方法ではありません。

まず、コメントに記載されている通り、mallocを使用しないでください。動的メモリ割り当てが必要な場合は、newを使用してください。さもなければ、あなたが既に話されているように、非構築オブジェクトを持ちます。

第2に、必要がない場合はnewを使用しないでください。動的メモリ割り当てが必要な場合は、std::unique_ptrのようにスマートポインタを使用してこのメ​​モリを管理することをお勧めします。 unique_ptr<T>を作成するには、std::make_unique<T>()関数を使用します。 make_uniqueを使用すると、無償でプログラムのリークフリーと例外安全を実現します。 make_unique()を使用すると、例外によるリークのトリッキーな状況を防ぐことができ、コードを書くときにいくつかのキーストロークを節約できます。もちろん、ゼロコストで。 GotW #89 Solution: Smart Pointersを参照してください。

第3に、ここでは動的メモリ割り当ては必要ありません。これはJavaではありません。スタックに物を割り当てることが大好きです。 std::vector自体がバッファを格納するために動的メモリ割り当てを行うことに注意してください。そしてセマンティクスのために、このストレージを実行時に有効に移動することができます。 vector自体をダイナミックメモリに割り当てることはあまり意味がありません。 Why should C++ programmers minimize use of 'new'?

それぞれを検索するは、を強調しています。

関連する問題