No.8ベストアンサー
- 回答日時:
ClassA *p = new(buf) ClassA;
と
ClassA *p = new ClassA;
の意味は違います. 後者はメモリを割り当てますが, 前者ではメモリの割り当ては行われません. placement new なんかで調べてもらうといいかな.
御回答ありがとうございます。
placement newは、new演算子関数に、引数を与える機能のようですね。
はじめて知りました。
今回の場合、bufの指すアドレスを、pが指すようにしているのだと分かりました。
(printf("%p", buf); と pring("%p", p); で表示されるアドレス値が同じでした。)
No.7
- 回答日時:
ちょっと気になるんですが明示的に破棄したいコードがあるんですか?
それとも単なる興味?
いや興味ならいいんですが、ただ素直にnew-deleteすればいいのになぁと思ったので。
>No1の型の回答に書いた通り、「クラスオブジェクト」とは、何らかのクラス型のオブジェクトの事です。
>普通はどのように呼ぶべきなのでしょうか?
自動変数のクラス?
私なら簡単なソースを書いて「このローカル変数nを明示的に破棄したい」という風な書き方にしますかね。
>普通は単に「オブジェクト」というのかもしれませんが、普通の変数など、他のオブジェクトとの区別をするために、その様に読んでいます。
str_type *p = new str_type; //←newしたデータ=オブジェクト(=インスタンス)
何か勘違いしてるみたいですけど、オブジェクトって物凄く広い意味で使われるので曖昧回避したい場合は極力使わない方がよい単語です。
ちなみにNo.1氏の「class_a」や上に書いた「*p」なんかをインスタンスと呼びます。
インスタンスもオブジェクトの一種です。(厳密に言うと違うものらしいですが)
御回答ありがとうございます。
>ちょっと気になるんですが明示的に破棄したいコードがあるんですか?
いや、そういうわけではありません。
>何か勘違いしてるみたいですけど、オブジェクトって物凄く広い意味で使われるので曖昧回避したい場合は極力使わない方がよい単語です。
ちなみにNo.1氏の「class_a」や上に書いた「*p」なんかをインスタンスと呼びます。
御指摘ありがとうございます。
http://itpro.nikkeibp.co.jp/free/NIP/NIPCOLUMN/2 …
にオブジェクトとインスタンスについて、分かりやすく説明されていました。
間違いに気がついて良かったです。
No.6
- 回答日時:
すでに #5 の方が回答されていますが、デストラクタはオブジェクトを破棄するためにあるのではなく、オブジェクトが破棄されるときに後処理をするためにあります。
デストラクタ自体は、他のメンバ関数(メソッド)と同様に1メンバ関数に過ぎませんが、C++ の仕組みとして、オブジェクトが破棄されるときにデストラクタがあれば自動的にコールするようになっている、という仕組みになっています。デストラクタをプログラム中から意図的にコールするというのは、あまりやらないですね・・・・・・・。いろいろ試してまた疑問が出てきて解決していけば、そうやっていくうちにいろんな間違って覚えていたことが修正されていくのは技術向上の鉄則です。頑張ってください^^。
No.5
- 回答日時:
> プログラムの終了時に、全てのクラスオブジェクトは、
> デストラクタが呼び出されて破棄されますが
逆ですね。
「オブジェクトが破棄される時にデストラクタが呼び出される。」
だと思います。
なので、追加質問でも
> ob.str_type::~str_type();
では、単にデストラクタを明示的に呼び出しただけでobは破棄されず
スコープから外れた時に破棄されてもう一度デストラクタが呼ばれた
のだと思います。
御回答ありがとうございます。
なるほど、僕が勘違いしていたみたいですね。
という事は、デストラクタを呼び出しただけでは、
オブジェクトは破棄されないのですね。
よーく分かりました。
No.3
- 回答日時:
無理すれば
char buf[sizeof (ClassA)];
ClassA *p = new(buf) ClassA;
// なんかする
p->ClassA::~ClassA();
ともできるけど普通はスコープで対応する... あぁそうか, 「プログラムの終了時に、全てのクラスオブジェクトは、デストラクタが呼び出されて破棄されますが」という認識がおかしいんだ.
この回答への補足
Tacosanさん、
ClassA *p = new(buf) ClassA;
は、pにサイズbufのメモリを動的に割り当て、
ClassA型オブジェクトの先頭を指すようにするという意味でよろしいのでしょうか?
だとすると、単に
ClassA *p = new ClassA;
だけでも良いと思うのですが、如何でしょうか?
あと、
ClassA *p = new(buf) ClassA;
で、オブジェクトポインタにメモリを割り当てた後、
そのまま終了しても、ClassAクラスのデストラクタは呼び出されませんでした。
オブジェクト変数を生成しない限り、デストラクタは呼び出されないのでしょうか?
オブジェクトポインタ
Tacosanさん、いつも御回答、ありがとうございます。
p->ClassA::~ClassA();
のように、デストラクタを明示的に呼び出せる事は知りませんでした。
あまり大きなプログラムを作成した事がないので、
「普通はスコープで対応する」という事は、考えた事がありませんでした。
これからは、そういった認識を持つようにします。
No.2
- 回答日時:
#1 の方の回答で、やりたいことができるのでは、と思うのですが、オブジェクトのライフタイムの認識があってないかもしれません・・・・・・。
オブジェクトのライフタイムは記憶クラスの「スコープ内」です。スコープが終了するときには破棄されます。関数やメソッド、{}で囲まれたブロック内で宣言しているオブジェクト変数(auto 記憶クラス)であればそれらが終了する時です。もちろん static などで確保されているクラス変数は、プログラムが終わるまで破棄されません。
この回答への補足
追加質問です。
str_typeというクラスを定義し、main関数で
str_type ob;
ob.str_type::~str_type();
のようにすると、コンストラクタとデストラクタが呼び出されたのですが、
プログラムの終了時に、デストラクタがもう一度呼び出されました。
ob.str_type::~str_type();
によって、obは破棄されたはずなのに、なぜこういった事が起こるのでしょうか?
御回答ありがとうございます。
今まで、オブジェクトのライフタイムについては、深く考えた事がありませんでした。
特に、「記憶クラスのスコープ」というものの認識があいまいなようです。
勉強し直してきます。
No.1
- 回答日時:
……クラスオブジェクト?なんのこっちゃ?
とりあえずやりたいことはこれかな?
class ClassA
{
};
int main(int argc, char** argv)
{
ClassA class_a;
// 何らかの処理-1
delete class_a; // もちろん間違いだけどこれと似たようなことがやりたい
// 何らかの処理-2
return 0;
}
もし上のようなことがしたいならば、変数のスコープを利用して以下のようにすれば可能です。
int main(int argc, char** argv)
{
{
ClassA class_a;
// 何らかの処理-1
// オブジェクト破棄のための文は書く必要がない
}
// 何らかの処理-2
return 0;
}
御回答ありがとうございます。
僕が言っている「クラスオブジェクト」は、記述して下さったプログラムのclass_aの事です。
普通は単に「オブジェクト」というのかもしれませんが、普通の変数など、他のオブジェクトとの区別をするために、その様に読んでいます。
僕がやりたかった事は、当に最初に記述していたプログラムのような事です。
2つ目のプログラムでは、main関数の中で、{ }で括った部分のオブジェクトは、処理が } まで進むと自動的に破棄されるというものですよね。
そのような事ができるとは知りませんでした。
試させていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】大変な警告
【大喜利】「今このパソコンは大変危険な状態です」という警告メッセージを無視してパソコンを開いたら、こんなことが起こった
-
【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
【お題】 『寿司』がテーマの本のタイトルを考えてください
-
あなたの「プチ贅沢」はなんですか?
お仕事や勉強などを頑張った自分へのご褒美としてやっている「プチ贅沢」があったら教えてください。
-
テレビやラジオに出たことがある人、いますか?
テレビやラジオに取材されたり、ゲスト出演したことある方いますか?
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
CString から LPCTSTRの型に変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 同じ名前のオブジェクトを...
-
VBAのWindowオブジェクトとWork...
-
パワーポイントのVBAでテキスト...
-
ビジュアルC++でボタンの有...
-
Excelで =EMBED("Acrobat Docu...
-
ワイルドカード<?>と型パラメー...
-
EXCEL VBAにて動的にCheckBOXを...
-
戻り値がクラスオブジェクト
-
VBSでのステートメントの末尾が...
-
Object型からDouble型へのキャスト
-
Strutsでファイルアップロード
-
Vbで通常使用するプリンターを...
-
TextFieldの文字の折り返し
-
JavaScriptでペーストイベント...
-
【JavaScript】エレメントって...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
Visual Studioでのbmpファイル...
-
インデザインのテキスト回り込み
-
LDAPにアクセスしてNamingEnume...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
C#でフォームのオブジェクト名...
-
VBA 同じ名前のオブジェクトを...
-
VBAのWindowオブジェクトとWork...
-
ワイルドカード<?>と型パラメー...
-
LISTBOXの内容が更新されま...
-
error C2712: オブジェクト ア...
-
Object型からDouble型へのキャスト
-
ビジュアルC++でボタンの有...
-
オブジェクトレベルとメタレベル
-
戻り値がクラスオブジェクト
-
オブジェクトに値を保持させる...
-
ASP.net 教えてください!!(...
-
時間帯判定をする。
-
Vbで通常使用するプリンターを...
-
Accessの連結・非連結オブジェ...
-
COMコンポーネントって何?
-
JAVAからHTMLへ値を返す方法
おすすめ情報