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 }
  • 相关阅读:
    [leetcode-495-Teemo Attacking]
    [leetcode-413-Arithmetic Slices]
    document对象操作:浏览器页面文件
    搭建wamp环境,数据库基础知识
    jenkins配置邮箱服务器(126邮箱)
    Linux命令之文件与用户权限
    并发与同步、信号量与管程、生产者消费者问题
    TypeScript设计模式之职责链、状态
    了解HTML列表
    CSS画出的图
  • 原文地址:https://www.cnblogs.com/hustcser/p/3638125.html
Copyright © 2011-2022 走看看