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

posted @ 2014-07-11 09:53  forrHuen  阅读(874)  评论(0编辑  收藏  举报