C++におけるメモリ解放
現在、c++で作業をしているのですが、気になるところがありましたので、質問させていただきます。
c++において、new演算子を用いてオブジェクトを生成した場合、使用後はdelete文を書くことで明示的に
そのオブジェクトをdeleteし、メモリを解放します。
[===言葉では伝わりづらいのでコードに読み飛ばしていただいても結構です。===]
そこで、変数を宣言かつnewを使ってクラスのメンバ関数内で初期化した場合、
そのオブジェクトはどうやってdeleteすればいいのでしょうか。(そもそもそのままほっといた時にメモリリーク自体が起こるのかも疑問です。)
というのも、そこで宣言したオブジェクトは他のメンバ関数内でも使いたいので、
定義した関数内でdeleteしてしまうと他のメンバ関数では使えなくなる(または挙動が思い通りにいかなくなる)のではないかと思っております。
[=======================================================]
何か知恵をお貸しいただけたらと思います。
言葉だと上手く伝わらないと思いますので、今取り組んでいるコードをかなり簡易化したものを下にのせましたのでそちらもご参照ください。
該当のソースコード
ここに載せるにあたって細かいところを改変しているのでsyntaxは気にしないでください。(include <string>の省略など。)
このコードだけでも意味は十分伝わると思いますので、あくまでかなりc++ライクな疑似コードとしてとらえていただければと思います。
以下をsub.hppとします。
c++
1#include <map> 2 3class Node { 4public: 5 string name; 6 Node(string n): name(n){} 7}; 8 9class Graph { 10public: 11 Graph(void); 12 virtual ~Graph(void); 13 map<string, Node*> nmap; 14 15 void setNName(string name, string nickname); 16 void getName(string nickname); 17};
以下をsub.cppとします
c++
1#include "sub.hpp" 2void Graph::setNName(string name, string nickname){ 3 Node* node = new Node(name); 4 nmap[nickname] = node; 5} 6 7void Graph::getName(string nickname){ 8 cout << nmap[nickname]->name << endl; 9}
これを以下のmain.cppで使うとしたら、
C++
1#include "sub.hpp" 2int main(){ 3 Graph g; 4 string name = "tanaka" 5 string nickname = "tanapyon" 6 g.setNName(name,nickname); 7 g.getName(nickname); //tanapyonが出力される 8}
このとき、sub.cppのGraph::setNName()内でnewを用いて作られたnodeはdeleteされていないのですが、
このままだと実際にメモリリークは起こるのでしょうか。
起こるのだとしたら、どこにdeleteを書き加えれば良いのか、
起こらないのだとしたら、なぜ起こらないのか。(私には直感的に起こるように見えてしまうので詳しい説明をしていただければとてもありがたいです。。。)
つまり
・上記プログラムでメモリリークが起こるのか否か。
・起こる場合はどこにdeleteを書けば良いのか。
・起こらない場合はなぜ起こらないと言えるのか。(stackやheapなどのメモリ配置を用いて説明していただけると理解が深まります)
よろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/06 10:43