質問内容
スタック領域に確保されたメモリのポインタを外部に渡すのは危険だと思うのですが
とあるライブラリで下記のような関数(doSomething)を見かけました。問題ないものでしょうか?
危険だと思ったコード
引数で受け取った文字列をローカルの配列(local_name)にコピーし、その配列のポインタをfoo構造体の変数nameに入れています。
c++
1struct bar* global_bar = nullptr; 2 3void doSomething(const char *name) { 4 char local_name[1024]; 5 strcpy( local_name, name ); 6 struct foo = {0}; 7 foo.name = local_name; 8 struct bar* b = create_bar(&foo); 9 global_bar = b; 10}
local_nameの内容はスタック領域に存在するのでdoSomethingを抜けた時点で不定となるため foo.name = local_name
は危険だと思うのですがその認識であっていますでしょうか?
このような場合は create_bar() 内で改めてヒープ領域にメモリを確保してそこにnameの値がコピーされていると考えればよいでしょうか。(もちろんそれは create_bar() 次第なので知るか!と思われるかもしれませんがその関数のドキュメントでは何も言及されていません。)
ただ、不思議なのはもし create_bar() 内で改めてメモリが確保されるのであればdoSomething()内で local_name 配列なんてわざわざ用意せずに foo.name = name
というように doSomethingの引数のnameのポインタ値を直接代入してしまえばよいと思うのです。
私のc/c++歴は1ヶ月程度ですので全く不可解な質問であればすみません。
(尚、char local_name[1024] はスタック領域に確保されるとしてください。)
以上、よろしくお願いいたします。
回答5件
あなたの回答
tips
プレビュー