- يجب أن يقابل كل كلمة new، كلمة delete. وإلا فإن البرنامج سيستهلك مساحات من الذاكرة أكبر بكثير مما يحتاجه، فيما يعرف بـMemory Leakage، أو تسرب الذاكرة.
- مشكلة Shallow Copying، أو النسخ السطحي، والتي تحدث بكثرة في الكلاسات التي تحوي في داخلها مؤشرات. أحياناً تكون هذه المشكلة واضحة، وأحياناً أخرى تكون أقل وضوحاً، كالمثال التالي:
#include <vector>
using namespace std;
class Example
{
public:
int* p;
Example(): p(new int) {}
~Example()
{
delete p;
}
};
int main()
{
vector<Example> a;
a.push_back(Example());
return 0;
}
#include <vector>
using namespace std;
class Example
{
public:
int* p;
Example(): p(new int) {}
Example(const Example& other)
{
p= new int;
*p= *(other.p);
}
~Example()
{
delete p;
}
};
int main()
{
vector<Example> a;
a.push_back(Example());
return 0;
}
- مشكلة المؤشرات الجامحة Stray Pointers، التي تم تحرير الذاكرة التي حجزتها (بواسطة delete)، لكن لم يتم تصفيرها (إسناد القيمة NULL أو 0 إليها)، والتي تحدث غالباً عند حدوث الـShallow Copy، الكود السابق هو مثال عليها، حيث تم حذف المؤشر، ومن ثم تمت محاولة إعادة حذفه مرة أخرى، مما سبب الخطأ.
- مثال آخر على الـMemory Leak، كما هو من مقالة:
void foo()
{
MyClass* p(new MyClass);
p->DoSomething();
delete p;
}
delete p;
- إدارة الذاكرة... فبعض أنواع المؤشرات الذكية تحرص على أن لا يشير إلى المنطقة الواحدة من الذاكرة أكثر من مؤشر واحد، وعندما ينتهي عمر هذه المؤشرات فإنها تقوم تلقائياً بتحرير الذاكرة.
نوع آخر من المؤشرات يسمح لأكثر من مؤشر أن يشيروا إلى المكان ذاته في الذاكرة، ولا يحرره إلا عندما ينتهي عمر آخر مؤشر كان يشير إليه.
إذاً، فإن هذه المؤشرات تقوم بتقليل احتمالية حدوث الـBugs الخاصة بالذاكرة، كما تقوم بالـGarbage Collection لتجنب الـMemory Leakage. - التوفير في استهلاك الذاكرة... فلنفترض أننا قمنا بالتأشير بأحد المؤشرات إلى كائن كبير جداً، ثم أردنا نسخه، فإن هذا يعني أنه سيصبح لدينا نسختان من هذا الكائن في الذاكرة، وعندما ننسخه عشر مرات فسيصبح لدينا عشر نسخ...
أحد أنواع المؤشرات الذكية، يقوم بحل مشكلة كهذه بطريقة "ذكية"، فهو كما سنرى يقوم عند النسخ بجعل كل المؤشرات تشير إلى الكائن نفسه في الذاكرة، لكن عندما يحاول أحد هذه المؤشرات إجراء أي تعديل على الكائن، يقوم بإنشاء نسخة جديدة لهذا المؤشر ثم يجري التعديلات على النسخة، بينما تبقى المؤشرات الأخرى كلها تشير إلى النسخة الأصلية، مما يوفر الكثير من الذاكرة.