• 締切済み

C++ shared_arrayについて

C++ の boost ライブラリの shared_array の挙動についての質問です。 int main() { boost::shared_arrray<char> hoge(char[1000]); boost::shared_arrray<char> hoge(char[1000]); boost::shared_arrray<char> hoge(char[1000]); sleep(100); return 0; } というプログラムがあった場合、sleep中のメモリの確保状況はどのようになるのでしょうか? shared_ptr で上記のようなコードを書くと、コンパイラがredeclarationのエラーを吐きますがshared_arrayではコンパイルが通り、動作はします。 しかしながらメモリーリークなどのバグの温床にならないか不安です。 上記のコードは安全なコードなのでしょうか? よろしければどうして前者はコンパイルが通り、後者はエラーとなったかについても言及していただけると嬉しいです。 よろしくお願いします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

せめて使ったコンパイラの名前やバージョン, 実際のエラーメッセージそのものを見せてほしいんだけど.... でも, 少なくともこのプログラムではメモリリークをおこすことはありえません. この宣言の意味がわかれば理由はあきらかですが, そもそもメモリを確保しない以上リークできません.

関連するQ&A

  • thisをshared_ptrにキャストするには?

    こんにちは。 boost::shared_ptrを使用しているのですが、 boost::shared_ptr< Foo > lpRet ; lpRet = boost::shared_dynamic_cast< Foo, Hoge >( this ) ; のようなthisポインタをキャストしたいのですが、 どのように書けばよろしいのでしょうか?

  • スマートポインタの使い方

    boost::shared_ptrについてなのですが vector<shared_ptr<CTest>> vec; 上記のベクタの要素を別のクラスからも参照しておきたい場合、 shared_ptr<CTest> p = vec[0]みたいにスマートポインタで持っておくか、 単にCTest* p = vec[0]._Ptrとしてポインタを持っておくのとどちらが良いのでしょうか?

  • [C]char型のダブルポインタ

    粗雑で申し訳ありませんが、 以下のソースをコンパイルできましたが、 うまく実行できません。 自分なりに間違いがないと思うのですが、 間違い等をご指摘頂ければ助かります。 #include <stdio.h> void func(char **ptr) ptr[][10] か (*ptr)[] なら通る *ptr[] は通らない { printf("----- func -----"); printf("%s\n", *ptr); printf("%c\n", **ptr); putchar('\n'); } int main(void) { char str[5][10] = {"AAAAA", *str[] にすると func で **ptr で通る "BBBBB", "CCCCC", "DDDDD", "EEEEE", }; printf("----- main -----"); printf("%s\n", *str); printf("%c\n", **str); putchar('\n'); func(str); return (0); } 実行結果 ----- main ----- AAAAA A ----- func ----- Bus error (core dump) 関数への受け渡しで、型が違うというお叱りを受けますが、 コンパイルはできました。 コンパイラはCCです。 ではよろしくお願いします。

  • (C++)スマートポインタをメンバ変数で使いたい

    Viual Studio 2013を使ってC++のコードを書いています。 以下のコードで、new-deleteの クラス生成をスマートポインタで置き換えたいのですが、 うまくいきません。具体的には/* not smart */の部分を スマートポインタで置き換えたいが、C2059のエラーが出てきて コンパイルできないのが理解できていません。 どなたかわかる方教えていただければ幸いです。 よろしくお願いします。 // ----コードは以下---- #include <memory> #include <iostream> class Hoge { public: Hoge(){ std::cout << "constructed!" << std::endl; }; ~Hoge(){ std::cout << "destructed!" << std::endl; }; private: }; class Hogehoge { public: Hogehoge(){}; ~Hogehoge(){ delete test; /* not smart */}; private: // error C2059 w/ VS2013 // std::unique_ptr<Hoge> test(new Hoge); Hoge* test = new Hoge; /* not smart */ }; void main() { Hogehoge foo; }

  • C++ 共変 戻り値について

    c++ で例えば、 class A { public:  virtual ~A() {} }; class B { public:  virtual ~B() {}  virtual B& hoge() = 0; }; class D:  public A,  public B { public:  virtual D& hoge() // この戻り値でエラー  {   ...;   return *this;  } }; のようにコードを書いたとします。 そして、これを gcc 3.3 でコンパイルしたところ「ゴメン。共変はサポートしてないんだ」って感じでエラーとなってしまいました(gcc 3.2 では問題を孕んでたくせに、何も言わずにコンパイル通ってました)。 この共変の意味や、その実際の挙動、問題点等は判ったのですが、では一体、この様な場合にどのようにコードを修正するのが正しいのか思い至りません。 どなたか、私ならって言うお考えがあればご教示願えないでしょうか? ちなみに、コンパイラーを変えるってのは無しです^^) ## gcc 4.0 ならいけるのかな??

  • c++のtemplateでエラーが出ます

    エラーメッセージ too few template-parameter-lists →私的には、templateへのパラメータが少なすぎる と理解しているのですが。。。 コード的にには、以下の通りです。 hoge.hh template<class T> myclass2 { public myclass1* piyo; : : } hoge.ccにて myclass1* myclass2<myclass3>:piyo; →ここで上記のエラー 別のヘッダにて class myclass3 : public myclass1<myclass3> { : : } という感じでコーディングしてます。 gcc3.2.2でのコンパイルでは、問題なくコンパイルでき 実行もできます。 ですが、gcc3.4.2を使用するとコンパイルエラーが出てしまいます。 このエラーの回避方法をご存知の方いらっしゃいましたら 御教授願えませんでしょうか よろしくお願い致します。

  • boostを利用したプログラムのコンパイルでエラー

    boostを初めて利用しようと思い、ファイルをダウンロードして、bjamを使ってインストールしました。そして以下のようなテスト用のプログラムを作成しました。 #include <boost/tokenizer.hpp> using namespace boost; int main(void) {   char_separator<char> sep(" \t\n");   tokenizer<char_separator<char> > tokens("aaa bbb ccc", sep);   return 0; } これをbcc32によりコンパイルすると、以下のようなエラーがいくつか発生してコンパイルができませんでした。 エラー E2489 c:\borland\bcc55\include\boost-1_33_1\boost/mpl/aux_/integral_wrapper.hpp 45: オプションコンテキスト応答深度の上限を超過: 再帰をチェックしてください なぜ、このようなエラーが出るのでしょうか。ちなみに、cygwin+gccではコンパイルおよび実行が可能でした。 ご存じの方がいらっしゃったらよろしくお願いします。(WinXPです)

  • eclipseの設定のJREとコンパイラの違い

    eclipseの設定で、インストール済みのJREとコンパイラの違いについて教えて いただけないでしょうか。 自分で調べてみた限りでは、、、 インストール済みのJREは、Javaプログラムの実行、デバッグに使用される。 コンパイラは、Javaプログラムのコンパイルに使用される。コンパイラ自体はeclipse 内部のものを使用しており、コンパイラ準拠レベルを指定することにより、指定した Javaのバージョンでコンパイルを行うことが可能。 上記の仕様だと、例えばインストール済みのJREのバージョンを1.6、コンパイラ準拠レベル に1.4を指定したとします。こうした場合、 String s = "hoge"; if(s.isEmpty()) { ・・・・ というコードはコンパイルエラーになるはずです。(String#isEmpty()は1.6から導入) コンパイルエラー⇒クラスができない⇒実行できない、という流れを想定していたの ですが、実際は、エディタ上でエラーになっておらず、コンパイルもでき、実行もできました。 インストール済みのJRE、コンパイラともに1.4を指定すると、エディタ上でエラーに なっていたし、コンパイルも行われていませんでした。 コンパイラ準拠レベルとはいったい???という状態です。 どこかに詳しく説明されているサイトなども教えて頂けるとうれしいです。 宜しくお願いします。 OS:Windows7 HomePremium eclipse:eclipse-jee-indigo-SR1-win32-x86_64.zip

    • ベストアンサー
    • Java
  • C++のソースに関する質問

    以下のコードをコンパイラのテスト目的でコンパイルしました //test.cpp #include <iostream> using namespace std; void main() { cout << "test" << endl; } 使っているコンパイラはBCC Developerと言うソフトです 上に書いているコードは間違っては居ないと思うのですが エラー E2266: ファイル名が指定されていない と言うエラーが出てきます、何処のファイルをどうやって 指定するのかを教えてください

  • ポインタの文字の代入について

    素朴な疑問ですが、なぜ宣言文の時には*ptrに文字列を代入してもエラーが出ないのに、宣言文以外のところで下記の記述をするとエラーが出るのですか? #include<stdio.h> void main(void) { char *ptr = "DEF"; *ptr = "ABC";//コンパイルエラー      ptr = "ABC";//正常 }

専門家に質問してみよう