[cppll:9299] Re: const pointer の delete
- Subject:
- [cppll:9299] Re: const pointer の delete
- From:
- Takefumi Nakayama <naka@...>
- Date:
- Tue, 05 Aug 2003 22:04:31 +0900
- X-Mailer:
- Becky! ver. 2.00.08
- Message-Id:
- <20030805220314.7B57.NAKA‐at‐reedrex.co.jp>
- In-Reply-To:
- 9296
- References:
- 9294 9296
こんばんは、中山です。
この話題は収束しつつありますが、さっき載せたコードに誤りがあったので、
一応訂正…
「GetPerson」に「const」つけてなかった・・・
> (2)クラスのメンバ変数が保持しているメモリ(リソース)はインスタンス開放時(デストラクタ)にて全て開放する。
--------------------------------------------------------------------------------------
class CHoge
{
public:
CHoge() : m_pPerson(NULL) {
}
virtual ~CHoge(){
SAFE_DELETE( m_pPerson ); //メモリが確保されていたら開放するマクロ
}
void Load( const CDB *pDB ){
SAFE_DELETE( m_pPerson ); //メモリが確保されていたら開放するマクロ
m_pPerson = new CPerson( pDB );
}
// これは「読取専用」でインスタンスのポインタを返したいねん。
// 呼び出し側で勝手に「delete」されたら困るねん(>_<)
const CPerson *GetPerson() const { return m_pPerson; }
private:
CPerson *m_pPerson;
};
--------------------------------------------------------------------------------------
更に、蛇足ですが、私が設けた2つのルールは
「スマートポインタというものの存在を知らなかった」
時の名残です(冷汗)
"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~
中山 剛史 <naka@...>
"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~
この話題は収束しつつありますが、さっき載せたコードに誤りがあったので、
一応訂正…
「GetPerson」に「const」つけてなかった・・・
> (2)クラスのメンバ変数が保持しているメモリ(リソース)はインスタンス開放時(デストラクタ)にて全て開放する。
--------------------------------------------------------------------------------------
class CHoge
{
public:
CHoge() : m_pPerson(NULL) {
}
virtual ~CHoge(){
SAFE_DELETE( m_pPerson ); //メモリが確保されていたら開放するマクロ
}
void Load( const CDB *pDB ){
SAFE_DELETE( m_pPerson ); //メモリが確保されていたら開放するマクロ
m_pPerson = new CPerson( pDB );
}
// これは「読取専用」でインスタンスのポインタを返したいねん。
// 呼び出し側で勝手に「delete」されたら困るねん(>_<)
const CPerson *GetPerson() const { return m_pPerson; }
private:
CPerson *m_pPerson;
};
--------------------------------------------------------------------------------------
更に、蛇足ですが、私が設けた2つのルールは
「スマートポインタというものの存在を知らなかった」
時の名残です(冷汗)
"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~
中山 剛史 <naka@...>
"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~^"~
▼ スレッド
- 9262: 「const 型へのポインタに delete をかます」という話題が 2 つのス レッドにまたがっているよう Daisuke TAKEUCHI
- ├9263: 名古屋大学大学院 情報科学研究科 計算機数理科学専攻 小野 孝男 Takao Ono
- │└9298: やはり、IS でも同じでしたか。 お調べいただき、ありがとうございました。 Small is Good. Daisuke T Daisuke TAKEUCHI
- └9264: IS ではないですが、以下のページに「const 型へのポインタに delete をか ます」のがなぜ合法か boochang
- └9265: この辺に超訳してみました: http://kentn.tripod.co.jp/weblog/2003_08_03_archive.html#106000857157478213 ところで Kent.N
- ├9268: 英語苦手なので(^^;)訳読みました。 スタックに起きたくないインスタンスの場合必要かと。。 Takefumi Nakayama
- │└9269: 先のメール、ちょっと間違いありました(^^;) 誤)Foo pObject = new Foo; // 呼び出し側としては、特にco Takefumi Nakayama
- └9270: つらつらと考えてみました。 class X { public: X(); ~X(); }; がある時に、 const X x; という宣言が出来 Satoshi Nakamura
- └9271: 確かに,出来る限りconst pointerはdeleteするべきでは無いんでしょうね. class Foo{ int *mpBuff; public: Foo( 思兼
- └9283: constインスタンスは消えない という考えを止めるだけでいいんじゃないでしょうか。 ガーベッ KOIE Hidetaka
- ├9292: そのものを消せるのは止めて欲しかったな、と思います。 スタックに構築されるオブジェクト Kent.N
- │├9294: このポインタを経由してはインスタンスを消せないという制約は、あってもい いと思います。 boochang
- ││├9296: 私は、constに「このポインタ経由でdeleteしちゃいかん」という意味がある方が むしろ然るべき Takefumi Nakayama
- │││├9299: この話題は収束しつつありますが、さっき載せたコードに誤りがあったので、 一応訂正… 「Get Takefumi Nakayama
- │││└9300: この話題は収束しつつありますが、さっき載せたコードに誤りがあったので、 一応訂正… 「Get Takefumi Nakayama
- ││└9297: うーん、それは[cppll:9268]の例をコンパイラが検出できないことと 似たり寄ったりだと思うんで Kent.N
- ││ └9301: 勝手に消されたくなければdtorをprivateにすればいいじゃん ということで、こんなところでどう KOIE Hidetaka
- │└9302: ということは、 const int n = 1; という記述も禁止するということになりますよね。さすがにそれ Satoshi Nakamura
- │ └9303: …なので、その筋の主張するにしても改善(改悪?)して欲しいのは new / delete でconstを許すかどう Kent.N
- └9295: 特にコーディング段階(いや、むしろ設計段階)では ・constインスタンスの中身は変更できない Takefumi Nakayama