
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も見ています
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Listに格納されているオブジェ...
-
StringBuilderのマルチスレッド
-
オブジェクト指向とは何ぞや…
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
VBAのWindowオブジェクトとWork...
-
自動クリックの処理について
-
newは明示的にした方が良いのか?
-
C#でフォームのオブジェクト名...
-
ASP.net 教えてください!!(...
-
JSPのout.printについて
-
javascript 例外処理
-
error C2712: オブジェクト ア...
-
Object型からDouble型へのキャスト
-
オブジェクト指向
-
VBAからノーツを起動
-
MapViewOfFile() はカウンタを...
-
Vbで通常使用するプリンターを...
-
CFileDialogでフォルダだけを選...
-
戻り値がクラスオブジェクト
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelで =EMBED("Acrobat Docu...
-
パワーポイントのVBAでテキスト...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBA 同じ名前のオブジェクトを...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
ビジュアルC++でボタンの有...
-
COMコンポーネントって何?
-
CoCreateInstanceでエラーになる。
-
ワイルドカード<?>と型パラメー...
-
戻り値がクラスオブジェクト
-
error C2712: オブジェクト ア...
-
Vbで通常使用するプリンターを...
-
質問すいません。 javascriptの...
-
Object型からDouble型へのキャスト
-
Accessの連結・非連結オブジェ...
-
オブジェクトレベルとメタレベル
-
C++でのクラスオブジェクトの破棄
-
時間帯判定をする。
-
VBAでvlookup関数から、別シー...
おすすめ情報