Latest web development tutorials
×

C++ หลักสูตร

C++ หลักสูตร C++ แนะนำโดยย่อ C++ การตั้งค่าสภาพแวดล้อม C++ ไวยากรณ์พื้นฐาน C++ หมายเหตุ C++ ชนิดข้อมูล C++ ประเภทตัวแปร C++ ขอบเขตตัวแปร C++ คงที่ C++ ประเภทการปรับเปลี่ยน C++ ประเภทการจัดเก็บ C++ ผู้ประกอบการ C++ การไหลเวียน C++ ผู้พิพากษา C++ ฟังก์ชัน C++ ดิจิตอล C++ แถว C++ เชือก C++ ชี้ C++ อ้างอิง C++ วันที่และเวลา C++ เอาท์พุทหรือ Basic Input C++ โครงสร้างข้อมูล

C++ เชิงวัตถุ

C++ คลาสและวัตถุ C++ สืบทอด C++ ผู้ประกอบการมากเกินไปและการทำงานมากเกินไป C++ polymorphism C++ ข้อมูลที่เป็นนามธรรม C++ ข้อมูล encapsulation C++ อินเตอร์เฟซ(ระดับนามธรรม)

C++ การสอนที่ทันสมัย

C++ แฟ้มและสตรีม C++ การจัดการข้อยกเว้น C++ หน่วยความจำแบบไดนามิก C++ namespaces C++ แบบ C++ preprocessor C++ การประมวลผลสัญญาณ C++ multithreading C++ Web โครงการ

C++ กรุ

C++ STL หลักสูตร C++ ห้องสมุดมาตรฐาน C++ ทรัพยากรที่มีประโยชน์

หน่วยความจำแบบไดนามิก 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;
}

หากคุณต้องการกล่องมีสี่วัตถุจัดสรรอาร์เรย์หน่วยความจำสร้างจะถูกเรียกว่าสี่ครั้งในลักษณะเดียวกันเมื่อคุณลบวัตถุเหล่านี้ destructor จะถูกเรียกว่าจำนวนครั้ง (ครั้งที่สี่)

เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:

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