質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

1803閲覧

コピーしたポインタ変数の解放処理

apa

総合スコア68

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/29 17:18

void main()
{
int *p = new int(1)
int *i = p
delete i
}
上記のような処理で、iはdeleteが呼ばれたことで cout ≪ *i ≪ endlは参照出来ずエラーがおきますが、cout ≪ *p ≪ endlはいままでどおりなかみを参照出来てしまいます。
まとめますと、同じアドレスを持ってるものを片方消した場合もう片方は消えないのでしょうか?それともヒープメモリ上では消えているが、データは残っている?のでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/05/29 22:53

new したメモリを delete しても、一般的な処理系ではメモリの内容はそのままで、次に new したときに再利用するためにプールされます。ので、再利用されるまでメモリの内容は残っている場合がありますが、あくまでも未定義動作であり、それを利用するプログラムは間違っています。
apa

2020/05/30 16:45

ポインタ系ややこしくて c++ 2、3年やってるんですけど まだマスターしきれないです 答えてくださったみなさんありがとうございました だいぶ理解でき成長できました!
guest

回答5

0

ベストアンサー

C++でnewでもCでmallocでも同様ですけど、領域を確保するものであって、特定のポインタ変数になにかするものではありません。少なくとも昔ながらのポインタ変数については。

仮に、1000番地からの領域が確保された場合、
例えば、別途「領域確保表」があって、確保した領域をリスト管理していたとすると、確保するときにそのリストに1000番地が付け加えられるとします(管理方法なんていくらでも考えられるので、実際にこうしているという話ではありません。確保した先頭番地の前に管理テーブルをつけるとか、いろいろ考えられます。)

で、確保した領域を解放するのは、「領域確保表」から登録を消したということです。

一方、ポインタ変数に1000番地を格納するというのは「1000番地」と書いたメモを作成するだけの話であって、そのメモを複製しようと、複製したものの一部を書き換えようと、解放したあとに参照しようと、それはシステムの知ったことではありません。

ローカル変数などの動的変数の話と一緒で、解放後の領域の内容は管理されていないものです。たまたま他のタスクが使っていなければ以前のデータが残っているかも知れませんが、いつ何時誰が書き換えても文句は言えない状態です。

投稿2020/05/29 22:45

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

delete 後のポインタを逆参照した結果は未定義なので
delete 後の動きを語るのは意味がありません。

投稿2020/05/29 22:26

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

deleteを読んでも
内部的にデータが残っていることがある

投稿2020/05/31 15:56

apa

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

deleteを読んでも
内部的にデータが残っていることがある

投稿2020/05/30 16:46

apa

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2020/05/30 22:16

言ってみれば、「鍵のない貸会議室のホワイトボード」なわけで。 会議室を「解放」したあとでも、まだ次の人が書いてなければホワイトボードには前に書いた内容がそのまま残ってる、かも知れない。 だからといって、勝手に使うなら、場合によっては、次の会議で使っているところにズカズカと入り込んでいって勝手にホワイトボードを書き換えるような行為になりかねない。
guest

0

処理系が分からないのでなんとも言えないのですが・・・

参照出来てしまいます。

オブジェクトの管理方法次第ですね。たぶんこれ↓

参照カウント

投稿2020/05/29 20:16

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問