首页 > 编程语言 >C/C++ 《二级指针浅拷贝》

C/C++ 《二级指针浅拷贝》

时间:2024-07-19 16:19:51浏览次数:12  
标签:10 int C++ 析构 new 拷贝 指针

背景

A对象内部属性a属于int ,动态分配内存回收,析构函数delete
A ** aptr = new A
[10] 申请10个空间长度的A*类型
测试浅拷贝

测试代码

#include<iostream>
using namespace std;
class A{
public:
    int* a;
    A(int i){ //构造函数
        a = new int(i) ;
    }
    ~A(){ //析构函数
        cout<<"~A() i = "<<*(this->a)<<endl;
        if(a!= nullptr){
            delete a;
            a= nullptr;
        }
    }
};

//二级指针的空间申请与分配
void test(){
    int len = 10;
    A ** aptr = new A*[len]; //申请10个空间为A*类型指针空间
    for(int i = 0; i < len; i++){
        aptr[i] = new A(i); //为每个指针申请空间
    }
    //先释放A*
    for (int i = 0; i < len; ++i) {
        delete aptr[i];
    }
    //再释放A**
    delete [] aptr;
}
//指针拷贝
void test_copy_ptrArr(){
    int len = 10;
    A ** aptr = new A*[len]; //申请10个空间为A*类型指针空间
    for(int i = 0; i < len; i++){
        aptr[i] = new A(i); //为每个指针申请空间
    }
    //拷贝(浅拷贝)
    A ** bptr = new A*[len];
    for (int i = 0; i < len; i++) {
        bptr[i] = aptr[i];// 属于浅拷贝
    }
    //打印地址查看
    for (int i = 0; i < len; ++i) {
        cout<<"aptr["<<i<<"] = "<<aptr[i]<<endl;
        cout<<"bptr["<<i<<"] = "<<bptr[i]<<endl; //两者打印的是一样
    }
//    delete[] aptr; //释放的是aptr,*aptr没有释放,可能会出现内存溢出
//    for (int i = 0; i < len; ++i) {
//        cout<<"aptr["<<i<<"] = "<<*(aptr[i]->a)<<endl;
//        cout<<"bptr["<<i<<"] = "<<*(bptr[i]->a)<<endl;
//    }
    //完整释放(拷贝后释放)
    for (int i = 0; i < len; ++i) {
        delete bptr[i]; // 会调用~A()析构函数
    }
    delete[] bptr;
    delete[] aptr;
}
int main()
{
//    test();
    test_copy_ptrArr();
    return 0;
}


标签:10,int,C++,析构,new,拷贝,指针
From: https://www.cnblogs.com/paylove/p/18311700

相关文章

  • C++数组中lower_bound和upper_bound函数的用法
    lower_bound函数首先,对于一个升序的数组(下标从0或者1开始是无所谓的,这里假设下标从1到n),即:a[1]<=a[2]<=a[3]<=...<=a[n]这个数列是(非严格)单调递增的。lower_bound(a+1,a+n+1,x)会返回a[1..n]中所有\(\gex\)的元素里面最小的那个数的地址。也就是说,......
  • C++信号处理
    什么是信号#include<csignal>或#include<signal.h>是处理信号的C-library。该库包含signal与raise两个功能函数。I.函数signal用于捕获信号,可指定信号处理的方式。II.函数raise产生一个信号,并向当前正在执行的程序发送该信号。signal()函数信号signal可以......
  • C++ 智能指针简单实现
    #pragmaoncetemplate<typenameTR>classjoker_shared_ptr{private:TR*ptr;size_t*count;public:constexprjoker_shared_ptr(/*args*/)noexcept{}constexprjoker_shared_ptr(std::nullptr_t)noexcept{}explicitjoker_sha......
  • C++ 的 const 重载
    #include<iostream>#include<string>namespace{classA{public:constA&get_self()const{std::cout<<"常量版本"<<std::endl;return*this;}A......
  • 【C++】C++标准库iostream中cin、cout、cerr、clog方法解析
    目录一.iostream库介绍1.iostream主要的组件2.使用 iostream 二.cin介绍及使用三.cout介绍及使用四.cerr介绍及使用五.clog介绍及使用一.iostream库介绍1.iostream主要的组件在C++中, iostream 是一个非常核心的头文件,它定义了基本的输入输出流。这个头文件是......
  • 算法刷题笔记 字符串哈希(C++实现)
    文章目录题目描述基本思路实现代码题目描述给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2,请你判断[l1,r1]和[l2,r2]这两个区间所包含的字符串子串是否完全相同。字符串中只包含大小写英文字母和数字。输入格式第一行包含整数n和m,表示字符......
  • 算法刷题笔记 八数码(C++实现)
    文章目录题目描述基本思路实现代码题目描述在一个3×3的网格中,1∼8这8个数字和一个x恰好不重不漏地分布在这3×3的网格中。例如:123x46758在游戏过程中,可以把x与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下......
  • C++(指针函数、函数指针)
    目录1.指针函数2.函数指针3.区别总结在C++中,指针函数和函数指针是两个不同的概念,尽管它们的名字非常相似。以下是详细的介绍和区别:1.指针函数指针函数(Pointertoafunction)是返回类型为指针的函数。它的返回值是一个指向某种数据类型的指针。以下是一个示例:int*get......
  • C++预处理器
    C++预处理器预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是C++语句,所以它们不会以分号(;)结尾。C++还支持很多预处理指令,比如#include、#define、#if、#else、#line......
  • 开源 C++ 框架 Ocean:用于计算机视觉和增强现实
    Facebook开源了其内部用于计算机视觉(CV)和增强现实(AR) 应用程序的框架Ocean,用于执行各种任务,包括计算机视觉、几何、媒体处理、网络和渲染。Ocean主要使用C++编写,且不依赖于特定平台:Ocean是一个独立于平台的框架,支持所有主要操作系统,包括iOS、Android、Quest......