1.静态内存,编译时申请,存储在栈,如基本数据类型。
2.动态内存由一些没有名字,只有地址的内存块构成。那些内存块是在程序运行期间动态分配的。它们来自一个标准c++库替你管理的“大池子”(内存池),从内存池申请一些内存需要用new语句,他将根据你提供的数据类型分配一块大小适当的内存。你不必担心内存块的尺寸问题。
3.注意在用完内存块之后,应该用delete语句把它返还内存池。另外作为一种附加的保险措施,在释放内存之后还要把关联的指针置NULL,对空指针进行“解引用”会报错。
class Company { public: Company(std::string theName); virtual void printInfo(); protected: std::string name; }; class TechCompany : public Company { public: TechCompany(std::string theName,std::string product); virtual void printInfo(); private: std::string product; }; Company::Company(std::string theName) { this->name = theName; } void Company::printInfo() { std::cout << "这个公司的名字叫:" << name <<".\n"; } TechCompany::TechCompany(std::string theName,std::string theProduct) : Company(theName) { this->product = theProduct; } void TechCompany::printInfo() { std::cout << name << "公司大量生产了 " << product << "这款产品!\n"; } int main(int argc, const char * argv[]) { Company *company = new Company("APPLE"); company->printInfo(); delete company; company = NULL; company = new TechCompany("APPLE","IPHONE"); company->printInfo(); delete company; company = NULL; return 0; }
控制台打印的结果是:
这个公司的名字叫:APPLE.
APPLE公司大量生产了 IPHONE这款产品!
2.动态数组
int main(int argc, const char * argv[]) { unsigned int count = 0; std::cout << "请输入数组的元素的个数:\n"; std::cin >> count; int *x = new int[count]; for (int i = 0; i < count; i++) { x[i] = i; } for (int i = 0; i < count; i++) { std::cout << "x[" << i << "] 的值是" << x[i] << std::endl; } delete []x; x = NULL; return 0; }
3.函数返回内存,也叫做指针函数。
任何一个函数都不应该把它自己的局部变量的指针作为它的返回值!因为局部变量的栈里,函数结束后会自动释放。如果你想让一个函数不会留下隐患的情况下返回一个指针,那么它只能是一个动态分配的内存块的基地址。
int* newInt(int value); int* newInt(int value) { int *myInt = new int; *myInt = value; //函数中申请的内存自动释放,所以不用delete myInt return myInt;//这里返回地址的原因是因为*myInt指针的局部的! } int main(int argc, const char * argv[]) { int *x = newInt(20); std::cout << *x; delete x; x = NULL; std::cout << std::endl; return 0; }
控制台打印结果为:20
4.动态内存不存在作用域的问题,一旦被分配,内存块就可以在程序的任何地方使用。因为动态内存没有作用域,所以必须由程序跟踪它们的使用情况,并在不再需要的时候把它们及时归还给系统。(有new的地方就要有delete)
函数中申请的内存,稍不小心就会出现内存泄露。通常有2种方法可以防止,第一种是返回指向内存的地址,第二种在函数里delete掉。