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 }
  • 相关阅读:
    基本MVVM 和 ICommand用法举例(转)
    WPF C# 命令的运行机制
    628. Maximum Product of Three Numbers
    605. Can Place Flowers
    581. Shortest Unsorted Continuous Subarray
    152. Maximum Product Subarray
    216. Combination Sum III
    448. Find All Numbers Disappeared in an Array
    268. Missing Number
    414. Third Maximum Number
  • 原文地址:https://www.cnblogs.com/hustcser/p/3638125.html
Copyright © 2011-2022 走看看