3

Objective-C オブジェクト ポインタの配列に動的にスペースを割り当てる Objective-C++ コードがあります。サイズは、Objective-C メッセージ呼び出しによって計算されます。

ItemCell **rawCells = new ItemCell*[[self cellCount]];

このコードは最終的にセグメンテーション違反を引き起こします。似たようなコード

ItemCell **rawCells = (ItemCell**)std::malloc([self cellCount] * (sizeof *rawCells));

うまく動作します。何が起きてる?

4

1 に答える 1

4

投稿者の回答からコピーされ(彼は自分自身に答えるカルマがないため、質問に入れました)、コミュニティwikiとしてマークされました(コピー/貼り付けはカルマを獲得してはならないため):

問題は、コンパイラが認識しないため、C++11 属性[[self cellCount]]として扱われ、無視されることです。その結果、ラインは効果的に

ItemCell **rawCells = new ItemCell*;

これは十分なストレージを割り当てません。これは gdb で確認しました。引数newは 8 で、単一のポインターのサイズです。

これを解決する最もコンパクトな方法は、余分な括弧のペアを挿入して、コンパイラが[[and]]を属性構文として認識しないようにすることです。

ItemCell **rawCells = new ItemCell*[([self cellCount])];

[self cellCount]の結果をローカル変数に格納して、new[]呼び出しで参照することもできます。

于 2013-06-24T18:49:28.677 に答える