首页 > 代码库 > c++第十二章 -(动态管理内存、动态数组和函数返回动态内存)

c++第十二章 -(动态管理内存、动态数组和函数返回动态内存)

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掉。