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

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

新規登録して質問してみよう
ただいま回答率
85.48%
DELETE

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

C++

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

Q&A

解決済

1回答

3758閲覧

delete後のpointerの再利用

shingo_

総合スコア8

DELETE

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

C++

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

0グッド

0クリップ

投稿2019/07/28 09:01

今C++について勉強中なのですが、
「delete後のポインタ」について
調べても回答が得られない疑問があり、皆さんに質問した次第です。
私が調べたことが正しいのかについても皆さんにお聞きしたいと思っております。
なので長文になっていますがお答えいただけると幸いです。


//調べたこと
私なりに本やネットで
メモリの動的確保と解放について調べたのですが、

結果として

delete後のポインタに対して、
①値を入れる。
②もう一度deleteする。
これらは定義がないので、
予期せぬ動作を引き起こしてしまう。

delete後のポインタには、「0」か「NULL」か「nullptr」を入れることが望ましい。
それらの値を持つポインタに対してdeleteは、「何もしない」という定義があるので、
予期せぬ動作を起こすことはない。
また0、NULLのようにマクロに定義されているものではなくnullptrを使うのが厳密な
動作のために良い。

ということがわかりました。
しかし、nullptrとなったポインタの再使用についてがわかりませんでした。


//質問

プログラム例

~省略~

delete p ;    //pはint型のポインタ
p = nullptr ;

このように delete後のポインタpをnullptrとした。として、
その後「p=new int;」やあるいは「p=&a;」等での再使用は問題なく行えるのでしょうか。
それとも一度、破棄されたポインタはどんな形にしたとしても使うと予期せぬ問題を起こしう
るのでしょうか。

私は問題なく使えるだろうと考えて、下に示すような簡単なプログラムを作り、何度か動作さ
せましたが、問題なく動作しました。
しかし、私の力では十分な実験が行えないですし、破棄というものに関しては、間違えばプロ
グラムに深刻な問題を与えるということなので、皆さんの意見を聞いておきたいのです。

回答よろしくお願いいたします。

#include<iostream>
using namespace std;

int main() {

int* p; p = new int; *p = 50; cout << *p << endl; delete p; p = nullptr; p = new int; *p = 100; cout << *p << endl;

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

このように delete後のポインタpをnullptrとした。として、

その後「p=new int;」やあるいは「p=&a;」等での再使用は問題なく行えるのでしょうか。
それとも一度、破棄されたポインタはどんな形にしたとしても使うと予期せぬ問題を起こしう
るのでしょうか。

全く問題無く利用できます。
破棄されるのはポインタ変数そのものではなく、ポインタが指すオブジェクトだからです。

delete後のポインタには、「0」か「NULL」か「nullptr」を入れることが望ましい。

それらの値を持つポインタに対してdeleteは、「何もしない」という定義があるので、
予期せぬ動作を起こすことはない。
また0、NULLのようにマクロに定義されているものではなくnullptrを使うのが厳密な
動作のために良い。

メリットのある習慣だと思います。ただし...

根本的にはnew/deleteに依る動的確保及び解放自体を避けるべきだと思います。
STLやスマートポインタを積極的に活用すれば、生ポインタをいじる機会は多く無い筈です。

投稿2019/07/28 09:07

編集2019/07/28 09:09
LouiS0616

総合スコア35660

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

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

shingo_

2019/07/28 09:42

ご回答ありがとうございます。 生ポインタをいじる機会は多く無い筈です。 →調べてみて「こんなもの使うより・・・」とおっしゃっている方が多くいらしたので、そのような気がうすうすしてはおりました。 ネット上にある私の疑問に似た質問とその回答をいくつか見ましたが、それではどうも自信が持てず、今回思い切って質問したのですが、自分の疑問に対して回答がいただけたのですっきりいたしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問