Latest web development tutorials

ذاكرة ديناميكية C ++

فهم ذاكرة ديناميكية في C ++ هو كيف العمل هو أن تصبح C ++ المؤهلين المبرمجين أساسي. ينقسم C ++ ذاكرة البرنامج إلى قسمين:

  • كومة: سوف كافة المتغيرات أعلن في الداخل وظيفة يستغرق الذاكرة المكدس.
  • كومة: هذا هو ذاكرة البرنامج لا يستخدم، تشغيل البرنامج يمكن أن تستخدم لتخصيص الذاكرة بشكل حيوي.

وفي كثير من الأحيان، لا يمكن التنبؤ مسبقا كيف هو مطلوب الكثير من الذاكرة لتخزين متغير المحددة في معلومات معينة مطلوبة لتحديد حجم الذاكرة المطلوبة في وقت التشغيل.

في C ++، يمكنك استخدام يتم تعيين مشغل خاص لمتغير من نوع معين من الذاكرة داخل كومة في وقت التشغيل، فإنها ترجع مساحة العنوان المخصصة. هذا المشغل هو أن تكون المشغلالجديد.

إذا كنت لا تحتاج إلى تخصيص الذاكرة بشكل، يمكنك استخدام المشغلحذف، حذف من قبل المشغل الجديد قبل الذاكرة المخصصة.

شركات جديدة وحذف

هنا هي المشغل الجديد أن يكون أي بناء الجملة العام من نوع بيانات التخصيص الحيوي من الذاكرة:

new data-type;

هنا، يمكن من نوع البيانات أن يكون أي المدمج في أنواع البيانات، بما في ذلك المصفوفات، يمكن أن يكون أي نوع من البيانات بما في ذلك فئة أو بنية، بما في ذلك المعرفة من قبل المستخدم.دعونا ننظر أولا إلى أنواع البيانات المضمنة. على سبيل المثال، يمكن أن نحدد مؤشر إلى مؤشر من نوع مزدوج، ثم يطلب الذاكرة، يتم تخصيص الذاكرة في وقت التشغيل. يمكننا استخدام المشغلالجديد وفقا للبيان التالي لإنجاز هذا:

double* pvalue  = NULL; // 初始化为 null 的指针
pvalue  = new double;   // 为变量请求内存

إذا استنفدت مناطق التخزين المجانية، فإنه قد لا بنجاح تخصيص الذاكرة. فإنه من المستحسن للتحقق ما إذا كان المشغل الجديد بإرجاع مؤشر فارغة، واتخاذ الإجراءات المناسبة ما يلي:

double* pvalue  = NULL;
if( !(pvalue  = new double ))
{
   cout << "Error: out of memory." <<endl;
   exit(1);

}

ظهرت وظيفةmalloc () في لغة C في C ++ لا يزال قائما، ولكن ينصح بعدم استخدام malloc (وظيفة).وظيفة جديدة وmalloc () مقارنة ميزته الرئيسية هي أنه ليس فقط تخصيص ذاكرة جديدة، فإنه أيضا خلق الكائن.

في أي وقت، وعندما تشعر أنك لم تعد هناك حاجة إلى المتغيرات الديناميكية الذاكرة المخصصة بالفعل، يمكنك استخدام عامل التشغيل حذف لتحرير الذاكرة استخدامه، على النحو التالي:

delete pvalue;        // 释放 pvalue 所指向的内存

المستخدمة في مفهوم أعلاه، يوضح المثال التالي كيفية استخدام جديدة وحذف مشغلي:

#include <iostream>
using namespace std;

int main ()
{
   double* pvalue  = NULL; // 初始化为 null 的指针
   pvalue  = new double;   // 为变量请求内存
 
   *pvalue = 29494.99;     // 在分配的地址存储值
   cout << "Value of pvalue : " << *pvalue << endl;

   delete pvalue;         // 释放内存

   return 0;
}

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها، وتنتج النتائج التالية:

Value of pvalue : 29495

مجموعة من تخصيص الذاكرة الديناميكية

لنفترض أننا نريد صفيف حرف (سلسلة من 20 حرفا) لتخصيص الذاكرة، يمكننا استخدام المثال أعلاه من تركيب مجموعة تخصيص الذاكرة بشكل حيوي، على النحو التالي:

char* pvalue  = NULL;   // 初始化为 null 的指针
pvalue  = new char[20]; // 为变量请求内存

لحذف مجموعة أنشأنا فقط، والبيان هو على النحو التالي:

delete [] pvalue;        // 删除 pvalue 所指向的数组

هنا هو بناء الجملة العام المشغل الجديد يمكن تخصيص الذاكرة لالمصفوفات متعددة الأبعاد، على النحو التالي:

int ROW = 2;
int COL = 3;
double **pvalue  = new double* [ROW]; // 为行分配内存

// 为列分配内存
for(int i = 0; i < COL; i++) {
    pvalue[i] = new double[COL];
}

تحرير الذاكرة مجموعة متعددة الأبعاد:

for(int i = 0; i < COL; i++) {
    delete[] pvalue[i];
}
delete [] pvalue; 

كائن تخصيص الذاكرة الديناميكية

والهدف من ذلك هو لا يختلف عن أنواع البيانات بسيطة. على سبيل المثال، والنظر في التعليمة البرمجية التالية، سوف نستخدم مجموعة من الكائنات لتوضيح هذا المفهوم:

#include <iostream>
using namespace std;

class Box
{
   public:
      Box() { 
         cout << "调用构造函数!" <<endl; 
      }
      ~Box() { 
         cout << "调用析构函数!" <<endl; 
      }
};

int main( )
{
   Box* myBoxArray = new Box[4];

   delete [] myBoxArray; // Delete array

   return 0;
}

إذا كنت ترغب في مربع يحتوي على أربعة أشياء تخصص مجموعة الذاكرة، وسوف يطلق منشئ أربع مرات، بنفس الطريقة، عند حذف هذه الكائنات، وسوف يطلق على المدمر نفس العدد من مرات (أربع مرات).

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها، وتنتج النتائج التالية:

调用构造函数!
调用构造函数!
调用构造函数!
调用构造函数!
调用析构函数!
调用析构函数!
调用析构函数!
调用析构函数!