2

膨大な量の掘り下げと検索の後、問題の根本を見つけました。本質的に、このコードが実行され、独自のプロジェクトで同じエラーが発生します。スマート ポインターを新しい文字列にリセットできないようですが、なぜですか? また、これを回避する簡単な方法はありますか?

scoped_array<char> sptr;
char* nptr = "Hello";

sptr.reset("");
sptr.reset(nptr);

編集 -

私はそれを理解したと思います。リセット中に、スマート ポインターは文字配列 ("") を削除して空にしようとしますが、これは new 演算子が使用されなかったため、ヒープに割り当てられませんでした (エヘム !!?!!?!???!?!)。したがって、このプログラムは、メモリの割り当てを解除しようとすると、惨めに壊れます。私が間違っている場合は修正してください。ただし、文字列自体はプログラムの実行可能なバイトストリーム自体に格納されますか? もしそうなら、将来の参考のために、新しい文字列の割り当てを強制する方法はありますか?

4

1 に答える 1

0

エラーを特定するのは正しいです。保持しているオブジェクトscoped_arrayを呼び出します。delete[]結局のところ、それがその存在の唯一の目的です。delete[]そうでないものはできませんnew[]'d。または、未定義の動作が発生します。

ただし、std::string動的文字列が必要な場合にのみ使用する必要があります。文字列のように動作できるように作成しようとするscoped_array<char>ものはすべて、見掛け倒しのバージョンのstd::string. 次に、次のように簡単ですstd::string s; s = ""; s = "Hello"

于 2012-04-22T04:43:41.750 に答える