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

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

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

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

Q&A

解決済

2回答

202閲覧

c++ メモリ解放について

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2019/04/17 09:53

編集2019/04/17 09:54

c++のメモリ解放でdeleteについてなのですが以下の提示コードではnew して新しいクラスのメモリを確保してそれをポインタ変数にアドレスを代入すると思うんですがその前に前newしたものを消さないとどの変数もアドレスを指していないので宙ぶらりんな領域として消せないものが出てしまうのではないかと思うのすがこれはdeleteしてただしのでしょうか?

cpp

1#include <iostream> 2//#include "conio.h" 3using namespace std; 4 5class test 6{ 7 int a; 8public: 9 10 test():a(0){ } 11 12 void print() 13 { 14 cout << a << endl; 15 } 16 17 void (test::* tp)() = &test::print; 18 19 void f2(int x) 20 { 21 a = x; 22 } 23 24 virtual void vf() 25 { 26 cout << "仮想関数\n"; 27 } 28 29 void ft() 30 { 31 cout << "test()\n"; 32 } 33 34// virtual void vf2() = 0;//純枠仮想関数 35 36protected: 37 void pf() 38 { 39 cout << "protected\n"; 40 } 41}; 42 43class sample : public test 44{ 45 int a; 46public: 47 48 void fx() 49 { 50 pf(); 51 } 52 53 void fs() 54 { 55 cout << "sample()\n"; 56 } 57 58 sample():a(0) { } 59 60 void vf() 61 { 62 cout << "派生関数\n"; 63 } 64 65 void print() 66 { 67 cout << a<<endl; 68 } 69 70 void f2(int x) 71 { 72 a = x; 73 } 74 75 virtual void vf2() 76 { 77 cout << "純枠仮想関数\n"; 78 } 79 80 81 82}; 83 84 85int main() 86{ 87 88 test *sa = new test(); 89 sa->vf(); 90 //sa->vf2(); 91 sa->f2(3); 92 sa->print(); 93 94 delete sa;//ここです 95 sa = new sample(); 96 sa->ft(); 97 sa->print(); 98 sa->f2(7); 99 100 test* sb = (test*)sa; 101 102 sb->print(); 103 //sb->vf(); 104// sb->vf2(); 105 106 107 108 109 110// int _r = _getch(); 111 return 0; 112}

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

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

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

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

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

guest

回答2

0

test *sa
に対して、
sa = new sample();
してるのも、半分迷子になってます。

投稿2019/04/17 13:45

yominet

総合スコア187

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

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

退会済みユーザー

退会済みユーザー

2019/04/18 08:47

どいういう意味でしょうか?deleteしてもってことでしょうか?
yominet

2019/04/18 13:20

test *sa sa = new sample(); delete sa; とすると、deleteの際に呼ばれるデストラクタがtestクラスのみになってしまう。
退会済みユーザー

退会済みユーザー

2019/04/20 12:46 編集

基底クラスのデストラクタをvirtualにしたのですがこれは正しいのでしょうか? ポリフォーリズムを利用するときはvirtual にするよう書いてあるのですが
episteme

2019/04/20 13:36

それでOK. てかそうすべき。
退会済みユーザー

退会済みユーザー

2019/04/20 13:56

ちょっと関係ない気がするのですがポリフォーリズムとは[簡単に言うと同じ名前のメソッドを複数のクラスで使用できるようにし、そのメソッドを通して、暗黙的に複数のインスタンスの動作を切り替えることができるようにします。]とありますが、もしポリフォーリズムをしない場合は外さないとどうさはどうなるのでしょうか?
episteme

2019/04/20 13:59 編集

やってごらんよ ※ ポリモーフィズム な。
guest

0

ベストアンサー

delete sa;// 返しましょう sa = new sample(); // 何を返すか忘れる前に

なーんてことを気にするくらいなら unique_ptr/shared_ptr 使うと幸せになれます。

投稿2019/04/17 10:17

編集2019/04/17 10:20
episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2019/04/17 10:21

つまりdeleteしてくださいということでしょうか?
episteme

2019/04/17 10:22

です。さもないと解放されぬまま"迷子"になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問