2017-05-10 8 views
-7

普通のポインタchar *char *boost::shared_ptrに変換する方法はありますか?char *をboost :: shared_ptrに変換する方法は?

char *str = "abcdfg"; 
boost::shared_ptr<char> ss = ?(str); 
+6

*手順*をお読みになりましたか? http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/shared_ptr.htm – Galik

+1

'shared_ptr'が文字列リテラルを削除しようとすると、どうなると思いますか? – Ari0nhh

答えて

6

文字列リテラルを共有ポインタに変換することはできません。

const char *str = "abcdfg"; 
boost::shared_ptr<char> ss(str); 

さて、これはコンパイルしますが、strが動的に割り当てられたメモリではありませんので、それは深刻な問題が生成されます:私はちょうどあなたのコードを「修正」した後、あなたが残っているしているすべての未定義の動作でみましょう。共有ポインタが破棄されるとすぐに、未定義の動作が発生します。

あなたは、その文字列をしたいのであれば、あなたが最初にそれをコピーする必要があります:

const char *str = "abcdfg"; 
boost::shared_ptr<char> ss(new char[std::strlen(str)+1]); 
std::strcpy(ss.get(), str); 

しかし、あなたはただ、なぜ最初にstd::stringを使用しないで、文字列にRAIIのセマンティクスを持つためにこれをやっている場合場所?

std::string sss(str); 
関連する問題