2011-02-17 9 views
1

SmartPointersを手に入れたので、私はDumbPointersを試してみることにしました.DumbPointersは、デストラクタで "delete"を呼び出すことは非常に難しい作業です。 、それが引き起こす「おそらくそれはポインタや適切なポインタではないのか?」の未定義の理由から次の理由でプログラムがハングアップすることがありますか?

DumbPointer<char> dumbPointer = "Hello World\0"; 

:DumbPointerを使用して、SmartPointerに配列を格納する私のテストを継続することを決定、私は前のエラーをリコールし、これを試してみましたハングするプログラム。当然、私はその問題を解決するための目で、理由を知りたいと思います。 (私はあなたを再保証してみましょう:デストラクタが呼び出された)私は今、以下ひどく複雑なDumbPointerコード(多分私は眠りに行く必要があります)を提供します

#pragma once 

#include "stdafx.h" 

template <typename T> class DumbPointer 
{ 
private: 
T* myPtr; 

public: 
T* Value() { return myPtr; } 

DumbPointer(const DumbPointer<T>& a) 
{ throw new "No assignments between DumbPointer."; } 
DumbPointer(T* ptr) { myPtr = ptr; } 
DumbPointer(T value) { myPtr = &value; } 
~DumbPointer() { delete myPtr; } 


operator T*() { return myPtr; } 
T* operator ->() { return myPtr; } 
}; 
+0

あなたの実際の質問から話題はありませんが、ここにヒントがあります。置き換え 'DumbPointer(const DumbPointer &a) {throw new" DumbPointer間の割り当てなし "; } 'と '民間: DumbPointer(constのDumbPointer & a); // DumbPointersがcopied'されない場合があり (あなたがメソッドを宣言し、それを定義しない場合(それに体を与えません)、そのメソッドを使用しようとしないとコードがコンパイルされますが、そのコードを使用しようとするとコンパイルが失敗します)。 基本的には、「コピー禁止」の制限をコンパイル時のエラーに変更するのではなく、実行時エラーです –

+0

ありがとう;意味があります –

答えて

5

をあなた必要がありますがnewに割り当てられただけdeleteポインタ。静的割り当てを持つDumbPointerに文字列定数を渡します。

+0

静的な記憶域ではなく自動ではなく、削除するのはとにかくUBです – sharptooth

+0

それは理にかなっていますが、文字列リテラルの呼び出し規則についてはわかりませんでした。作る彼らが新しいものを使わないようにするという意味です。ありがとう。 –

+0

ありがとう、編集されました。 –

0

Frederikのコメントに加えて、スマートポインタに文字列定数を割り当てる理由は絶対にありません。

ここでは絶対に何も削除されませんので、単純な古いchar*ポインタに割り当ててください。ここでも、削除やクリーンアップが必要なものは何もありません。

+0

私は彼のコメントを読んだ後、それは私が続いた考えの一般的な行です。 –

関連する問題