C++ 内存管理

auto ch0 = new char[];
        auto stu = new Student[];
        delete ch0;     //
        delete []ch0;   //
        delete stu;     //
        delete []stu;   //

问题是上述几个delete中哪个是错误的呢?很多人都会说1和3是错误的,因为申请了数组而释放的时候要像2和4那样进行释放。其实第一个不会发生内存泄漏。因为只有在申请自定义的对象如果不用数组释放方法进行释放才会发生内存泄漏。而内置的变量时不会的。但是也要成对应用,规范的使用运算符

auto ch0 = new char;   //
    auto ch1 = new char();  //

这两行代码有什么区别呢?一个加了括号一个没有加。那么它们的运行是一样的么?显然是不一样的,1行是没有进行初始化的。而2行是进行了初始化。如果我们申请的变量在一开始没有决定如何进行初始化时,不妨就不要初始化。等程序真正要初始化的时候我们再进行初始。这样我们就会少进行一次赋值操作。

实例练习:

#include <iostream>
#include <stdlib.h>
using namespace std;

int main(void)
{
    int *p = new int(); // 进行了初始化
    // int *p = new int;
    // *p = 20            // 申请内存时不进行初始化,随后赋值 
    cout << *p << endl;
    system("pause");
    return ;
}

练习2:

#include <iostream>
#include <stdlib.h>
using namespace std;

int main(void)
{
    int *p = new int;
    if(NULL == p) // 判断内存申请是否成功 
    {
        system("pause");
        return 0;
     } 
    *p = 20;           
    cout << *p << endl;
    
    delete p; // 释放指针 
    p = NULL; // 将p指针设为空
     
    system("pause");
    return 0;
}

练习3:

申请块内存

#include <iostream>
#include <stdlib.h>
using namespace std;

int main(void)
{
    int *p = new int[100];
    if(NULL == p) // 判断内存申请是否成功 
    {
        system("pause");
        return 0;
     } 
    p[0] = 10;
    p[1] = 20;           
    cout << p[0] << "," << p[1] << endl;
    
    delete []p; // 释放指针时必须用 []p,如果用p,只能释放块指针的第一个 
    p = NULL;   // 将p指针设为空
     
    system("pause");
    return 0;
}

相关推荐