![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?08b1c8b)
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で質問しましょう!
似たような質問が見つかりました
- Illustrator(イラストレーター) 【シェイプ形成ツール】でうまく分割できない 1 2022/05/26 10:57
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- C言語・C++・C# C# 継承の問題で programに示された拡張をすべて含んだ上で,クラス Mammal に,そのオ 1 2022/07/22 09:48
- PHP クラス 1 2022/08/08 15:12
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Illustrator(イラストレーター) イラストレーターの面積を求める 1 2022/04/17 11:05
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- システム CPUの問題について 2 2022/07/09 12:04
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- その他(プログラミング・Web制作) Pythonのオブジェクトの関数について 2 2023/05/11 19:15
このQ&Aを見た人はこんなQ&Aも見ています
-
好きな人を振り向かせるためにしたこと
大好きな人と会話のきっかけを少しでも作りたい、意識してもらいたい…! 振り向かせるためにどんなことをしたことがありますか?
-
何回やってもうまくいかないことは?
みなさんには、何回やってもうまくいかないことはありますか?
-
今の日本に期待することはなんですか?
目まぐるしく、日本も世界も状況が変わる中、あなたが今の日本に期待することはなんですか?
-
洋服何着持ってますか?
洋服を減らそうと思っているのですが、何着くらいが相場なのかわかりません。
-
「これいらなくない?」という慣習、教えてください
現代になって省略されてきたとはいえ、必要性のない慣習や風習、ありませんか?
-
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
CString から LPCTSTRの型に変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCEL VBAにて動的にCheckBOXを...
-
戻り値がクラスオブジェクト
-
error C2712: オブジェクト ア...
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
オブジェクトレベルとメタレベル
-
VBA 同じ名前のオブジェクトを...
-
Visual Studioでのbmpファイル...
-
0 == False はいいけど
-
VBAのWindowオブジェクトとWork...
-
Google Apps Scriptの時刻の計算
-
Listに格納されたオブジェクト...
-
ワイルドカード<?>と型パラメー...
-
Setステートメントの使い方につ...
-
SQLException
-
Object型からDouble型へのキャスト
-
bmp画像をjpegやpng画像に圧縮...
-
WithEventsの処理について
-
写真が合成か調べる方法
-
ResultSet での問題
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
VBA 同じ名前のオブジェクトを...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
VBAのWindowオブジェクトとWork...
-
ビジュアルC++でボタンの有...
-
C#でフォームのオブジェクト名...
-
COMコンポーネントって何?
-
Object型からDouble型へのキャスト
-
戻り値がクラスオブジェクト
-
Accessの連結・非連結オブジェ...
-
error C2712: オブジェクト ア...
-
CFileDialogでフォルダだけを選...
-
オブジェクトレベルとメタレベル
-
Vbで通常使用するプリンターを...
-
C++でのクラスオブジェクトの破棄
-
時間帯判定をする。
-
CoCreateInstanceでエラーになる。
-
LISTBOXの内容が更新されま...
おすすめ情報