zoukankan      html  css  js  c++  java
  • [008]new、delete及动态内存分配

    1、new和delete都会用,这里只声明一点:

    C++ 没有明确定义如何释放指向不是用 new 分配的内存地址的指针。

    比如下面的代码:

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 int main() {
     6     int i = 1;
     7     int *p0 = &i;
     8     int *p1 = new int();
     9     int *p2 = 0;
    10 
    11     delete p0;    // Compile OK, Run Error
    12     delete p1;    // Compile OK, Run OK
    13     delete p2;    // Compile OK, Run OK, No meaning
    14 
    15     return 0;
    16 }

    对于p0,编译器无法断定其是一个指向什么类型的指针,因此尽管这个语句是错误的,但是大部分编译器都能编译通过,运行时会出错。

    对于p1,指向初始化后的0值,对其作delete操作是可合法的

    对于p2,指针的值为0,对其作delete操作是可合法的,但是没有意义,因为C++保证:删除0值的指针是安全的。

    2、对于动态内存分配,如果和容器结合起来,需要注意的是:如果指针指向动态分配生成的指针,那么delete这个指针也是不可以的

     1 #include<iostream>
     2 #include<vector>
     3 #include<string>
     4 
     5 using namespace std;
     6 
     7 int main() {
     8     vector<string> svec(10, "hello World");  
     9     vector<string> *pvec1 = new vector<string>(10);   
    10     vector<string> *pv1 = &svec;  
    11     vector<string> *pv2 = pvec1;  
    12              
    13     cout << svec[0] << endl;
    14     cout << (*pvec1)[0] << endl;   // 要特别注意*pvec1的括号
    15     cout << (*pv1)[0] << endl;
    16     cout << (*pv2)[0] << endl;
    17 
    18     delete pvec1;
    19     delete pv1;                    // Compile OK, Run Error
    20     delete pv2;                    // Compile OK, Run Error
    21 }
  • 相关阅读:
    docker run 参数含义
    java——数组队列 ArrayQueue
    java——数组栈 ArrayStack
    java——时间复杂度、动态数组
    java——异常类、异常捕获、finally、异常抛出、自定义异常
    java——变量
    java——虚拟机、线程
    java——内部类
    java——object类
    java——抽象类、接口、二者区别
  • 原文地址:https://www.cnblogs.com/hustcser/p/3638125.html
Copyright © 2011-2022 走看看