ポインタメンバー変数をnullptrに初期化する必要がありますか?
3575 ワード
今日のブログは皆さんと一つの問題を討論して、一緒に勉強して進歩しました.
前のブログでは、さまざまなコードセグメントを使用して、さまざまな状況でのメモリ漏洩を実証しました.
今日実际の工事の中でまた指针のもたらす误りに出会って、分君は分かち合います.
説明:クラスAがあります.
クラスBがあります.
上のコードですが、簡略化されています.一言で言えば、BクラスではAクラスのポインタオブジェクトをメンバー変数として使用しています.
大丈夫だと思いますか?あるべき解析関数はすべてありますね...
しかし問題が来て、start()関数が実行されなかったらどうしますか?
start()が実行されていなければ、ポインタaにメモリが割り当てられていないので、aが空であれば、もちろんdelete a操作は実行されません.
しかし、実際の状況はあなたが想像していたようなものではありません.私たちはa=nullptrを保証することはできません.ゴミの値かもしれません.
では、aにメモリを割り当てる前にnullptrにaを割り当てる簡単な解決策があります.
初期化リストを使用して、関数を構築するときにaを割り当てます.
次は大神が私に教えてくれた:ifの中で直接aを判断しないでください.aは0、NULL、nullptrで、C++11だけnullptrをサポートします.
また、上記の書き方はプラットフォームの移植に不便です.
次のように変更します.
最後に君と分かち合う:
前のブログでは、さまざまなコードセグメントを使用して、さまざまな状況でのメモリ漏洩を実証しました.
今日実际の工事の中でまた指针のもたらす误りに出会って、分君は分かち合います.
説明:クラスAがあります.
class A
{
public:
A(){}
~A(){}
void show(){std::cout << "show" << std::endl;}
}
クラスBがあります.
class B
{
public:
B();
~B();
public:
void start();
private:
A * a;
}
B::B()
{
}
B::~B()
{
if(a)
{
delete a;
a = nullptr;
}
}
B::start()
{
a = new a();
}
上のコードですが、簡略化されています.一言で言えば、BクラスではAクラスのポインタオブジェクトをメンバー変数として使用しています.
大丈夫だと思いますか?あるべき解析関数はすべてありますね...
しかし問題が来て、start()関数が実行されなかったらどうしますか?
start()が実行されていなければ、ポインタaにメモリが割り当てられていないので、aが空であれば、もちろんdelete a操作は実行されません.
しかし、実際の状況はあなたが想像していたようなものではありません.私たちはa=nullptrを保証することはできません.ゴミの値かもしれません.
では、aにメモリを割り当てる前にnullptrにaを割り当てる簡単な解決策があります.
初期化リストを使用して、関数を構築するときにaを割り当てます.
B::B() : a(nullptr)
{
}
次は大神が私に教えてくれた:ifの中で直接aを判断しないでください.aは0、NULL、nullptrで、C++11だけnullptrをサポートします.
また、上記の書き方はプラットフォームの移植に不便です.
次のように変更します.
B::~B()
{
if(a != nullptr)
{
delete a;
a = nullptr;
}
}
最後に君と分かち合う:
#include
class Test
{
public:
Test() {}
~Test() {}
public:
void Show()
{
std::cout << "show" << std::endl;
}
};
int main()
{
Test* test;
std::cout << test; // ,VS
test = nullptr;
test = new Test();
test->Show();
if (test != nullptr)
{
delete test;
test = nullptr;
}
system("pause");
}