こんにちは、C++ でのメモリ管理に関する一般的な質問があります。このプログラムの助けを借りて、ヒープにメモリを割り当てるために new が使用され、スタックに一時変数が割り当てられていることを理解しました。また、ヒープにメモリを割り当てている場合は、手動で解放する必要があることもわかりました。そうしないと、メモリリークが発生します.
しかし、プログラムでは、ヒープにBST型の新しい変数tempを作成することにより、Insertという名前の関数でBST構造体のオブジェクトを更新しています.しかし、そのメモリを解放する方法がわかりません.最後にfreeコマンドを使用する場合関数、つまり free(temp) の場合、そのメモリに格納されている値が失われ、再度アクセスしようとするとエラーが発生します。また、ローカル変数ではないため、メインで free(temp) を使用することはできません。メインに。誰かが何をすべきか教えてもらえますか。
ところで、free(temp) を使用しなくても、私のプログラムは正しく動作していることに言及する必要がありますが、メモリ リークが発生していると思います。これは悪いことです。
また、デストラクタにコメントするとプログラムがエラーなしで実行されるのに、~BST()
コメントを外すとリンカーエラーが発生する理由について少し混乱しています。
#include<iostream>
#include<string>
#include<conio.h>
#include<array>
#include<stack>
#include<sstream>
#include<algorithm>
#include<vector>
#include<ctype.h>//isdigit
#include<deque>
#include<queue>
#include<map>
using namespace::std;
struct BST
{
int data;
BST *left;
BST *right;
BST(int d,struct BST* l,BST *r):data(d) , left(l) ,right(r)
{
}
BST()
{
}
//~BST();
};
void levelOrder(struct BST *root)
{
struct BST *temp=NULL;
int count =0;
deque<struct BST*> dq;
if(!root)
{
return;
}
dq.push_back(root);
count=dq.size();
while(!dq.empty())
{
temp=dq.front();
cout<<temp->data<<" ";
if(temp->left)
{
dq.push_back(temp->left);
}
if(temp->right)
{
dq.push_back(temp->right);
}
dq.pop_front();
if(--count==0)
{
cout<<endl;
count=dq.size();
}
}
}
void Insert(struct BST*root,int data)
{
//struct BST temp(data,NULL,NULL);
BST *temp = new BST(data,NULL,NULL);
temp->data =data;
temp->left= NULL;
temp->right=NULL;
if(!root)
{
return;
}
while(root)
{
if((root)->data >data)
{
(root)=(root)->left;
if(!(root)->left)
{
(root)->left=temp;
break;
}
}
else
{
(root)=(root)->right;
if(!(root)->right)
{
(root)->right=temp;
break;
}
}
}
}
int main()
{
deque<struct BST> dq1,dq2;
BST e(4,NULL,NULL);
BST f(3,NULL,NULL);
BST d(1,&f,NULL);
BST b(2,&d,&e);
BST c(8,NULL,NULL);
BST a(6,&b,&c);
levelOrder(&a);
Insert(&a,5);
cout<<a.left->right->right->data;
cout<<endl;
levelOrder(&a);
_getch();
return 0;
}