削除するバッファーにより異なるタイプのポインター?
-
09-06-2019 - |
質問
言い、以下のC++:
char *p = new char[cb];
SOME_STRUCT *pSS = (SOME_STRUCT *) p;
delete pSS;
この安全にC++の規格とは何ですか?いただいた後にキャストへ char*
およびその利用 delete[]
?この記事の評価欄へん多くのC++コンパイラで平常データの無destructors.であることが保証され安全ですか?
解決
であることが保証されていない安全です。ここで、該当するリンクは、C++FAQ lite:
[16.13】を落として []
を削除する場合、その配列の一部に内蔵タイプ(char
, int
, か。
http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.13
他のヒント
また、未定義の動作-コンパイラがplausiblyかないものがあり、としてC++のエントリー FAQ thudbang リンクは、 operator delete[]
が過負荷をかないものがある operator delete
.ときにその場を離れてでも良い練習ができる習慣を身に付のマッチングの削除[]新しい[]の場合がございます。
私の間違いです。
多くの疑問の方法でのメモリの解放は、例えば利用できる delete
ご char
配列より delete[]
ですが。I blogged 詳細につはここに自己リンクができますが、書き換えであります。
のコンパイラするのではなく、問題にしています。最も図書館の利用配分方法の基礎となる営業システムは、同じコードがうかMac前Windows前プログラムを利用しています。.私は例が見られるようになり、このことを一つひとつ疑問である。
の安全なアプローチを常に配分は、無料のメモリと同じデータ型になります。の場合は配分 char
s返しその他のコードは、よく提供する特定の配置/テスト方法
SOME_STRUCT* Allocate()
{
size_t cb; // Initialised to something
return (SOME_STRUCT*)(new char[cb]);
}
void Free(SOME_STRUCT* obj)
{
delete[] (char*)obj;
}
(過負荷の new
や delete
事業者にもオプションが、はこちらを行っています。)
C++スタンダード【5.3.5.2]を宣言す:
場合にはオペランドはクラスタイプのオペランドに変換されるポインタ型を呼び出し、上記の変換 機能の変換オペランドは、独自のオペランドの残りすること。のいずれか 代替の値はオペランドの削除の場合はnullポインタ値とします。 ない場合はnullポインタ値が、 代替削除オブジェクト、値のオペランドの削除は、ポインタを非配列オブジェクトまたはポインタ subobject(1.8)を表す基底クラスのオブジェクト(第10条).ない場合、動作は未定義です。第 代替削除配列)の値はオペランドの削除は、ポインタ値により前 配列に新しい。77)ない場合、動作は未定義です。【ご注意:このことは書式を削除しさを表現 一致しなければならない型のオブジェクトに割り当てられる新しい構文の表現です。末注意】 【ご注意:ポインタ にconstタイプのオペランドの削除、表現必要はありませんからは見えないのconstness(5.2.11) ポインタ表現を使うには、どのオペランドの削除を行いました。末注意】
これは非常に類似質問への回答はこちら リンクテキストをドキュメント
短期での安全ではありませんのC++ます。場合は、何らかの理由が必要となりSOME_STRUCTオブジェクト割り当てられてメモリの領域を持つサイズの違いから size_of(SOME_STRUCT)
(といほうがいいっ!), そのままに基づいており、また以下の原配分機能のようなグローバル operator new
行の配分、そしてオブジェクトインスタンス生のメモリの配置 new
.配置 new
極めて安い場合、オブジェクト型ではないコンストラクタです。
void* p = ::operator new( cb );
SOME_STRUCT* pSS = new (p) SOME_STRUCT;
// ...
delete pSS;
これまでに多くなります。常に仕事の場合 SOME_STRUCT
はポッド-struct.また、その他の場合の場合 SOME_STRUCT
's"のコンストラクタはスローさ SOME_STRUCT
いませんのでカスタムオペレーター削除します。この技術にも取り除を必要とするかぶり.
::operator new
や ::operator delete
C++'s近くに相当 malloc
や free
としてこれらのクラスオーバーライドすることとして適切 new
や delete
表現できる(注意!) きを組み合わせて使います。
この すべ 仕事というのはありえないと考えできることを保証で安全面では、SOME_STRUCTはchar*(いけtypedef).
また、以降のご利用の異なる種類の参照の場合の使用を継続-pのアクセスのメモリが削除された、ランタイムエラーが発生します。
これまでOKの場合は、記憶を指摘 や のポインタで指すとともPOD.この場合、デストラクタのものではなく、メモリアロケータを知らないやつのタイプの中に保存されたメモリの内容を消去します。
の場合はこの限りではあOK外のポッド型の場合はpointeeはサブタイプのポインタ(例えばご指車車*にポインタのデストラクタ宣言しましたvirtualなのです。
こん安全で、回答のことを指摘しており十分の狂気を行っています。ない場合、自由にリプログラマーやっとして働きたいリファレンスマニュアルを作できます。できるだけというおstructを行えるようにした。デストラクタ 現在, しかし、い敷手にあるコンパイラおよびシステムの特定のトラップ。また、コードは作品として期待される。のですが望んでいません。しかし思いのままゆっくりとくにメモリリークとして配列の配分を経由新しい非常に多く配分のメモリをバイト 事前 めに、返されるポインタです。することはできませんの解放にはメモリがあると考えます。良いメモリの割り当てルーチンはこのミスマッチのようにリーディングプロジェクトリなど。
なんと、パージから心の中のもの思考のプロセスにおいても、このようなナンセンスです。
私のコードを使用malloc/無料です。なんかMSVCを実装した新-削除のための平旧データ(SOME_STRUCTこの場合でしたWin32構造により、簡単C)だけを知りたいと思いましたポータブル。
なので、また利用したいと思いるものです。
ご利用の場合はmalloc/無料の代わりに新しい/削除、mallocや無料なのタイプです。
で使用している場合は、Cのようにポッド(プレーンデータのように組込型、struct、mallocのタイプ、無料です。 これは、貧しいスタイルでも作品.