zoukankan      html  css  js  c++  java
  • 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 <<".
    ";
    }
    
    TechCompany::TechCompany(std::string theName,std::string theProduct) : Company(theName)
    {
        this->product = theProduct;
    }
    
    void TechCompany::printInfo()
    {
        std::cout << name << "公司大量生产了 " << product << "这款产品!
    ";
    }
    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 << "请输入数组的元素的个数:
    ";
        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掉。

  • 相关阅读:
    《大话数据结构》最小生成树——Prim算法
    《大话数据结构》图的BFS和DFS
    寒假集训日志(三)——数论
    寒假集训日志(二)——最小生成树,拓扑排序,欧拉回路,连通路
    set
    寒假集训日志(一)——图,最短路问题
    经典的图论算法,C++描述
    动态数组
    stack and queue
    最长递增子序列,最长公共子串,最长公共子序列问题,最长公共增长子序列问题
  • 原文地址:https://www.cnblogs.com/huen/p/3836972.html
Copyright © 2011-2022 走看看