【问题标题】:print an array after deep copying in c++ classes在 C++ 类中进行深度复制后打印一个数组
【发布时间】:2021-01-23 18:02:51
【问题描述】:

我想实现以下行为:

  1. DataSequence 类有一个指针,指向主函数中的一个数组。
  2. 在初始化类 DataSequence 的对象时打印数组
  3. 创建同一对象的深层副本(通过复制构造函数)并在对象形成时打印它。

我写的代码如下:

#include<bits/stdc++.h>
using namespace std;

class DataSequence{
float *ptr;
int _size;

public:
    DataSequence(float input[] , int size){
        _size = size;
        ptr = new float; ptr = input;
        //print the array
        cout << "Main constructor" << endl;
        for(int i=0 ; i<_size; ++i){
            cout << *(ptr+i) << " ";
            // ++ptr;
        }
    }

    //copy constructor
    DataSequence(DataSequence &d){
        _size = d._size;
        ptr = new float; *ptr = *(d.ptr);
        //print the array
        cout << "copy constrructor" << endl;
        for(int i=0 ; i<_size ; ++i){
            cout << *(ptr+i) <<" ";
            // ++ptr;
        }
    }
 };


int32_t main(){
int size=4;
float input[size];
int bins;
input[0] = 3.4;
input[1] = 1.3;
input[2] = 2.51;
input[3] = 3.24;   

DataSequence d(input , size);
cout << endl;
DataSequence d1 = d;

return 0;
}

输出如下

Main constructor
3.4 1.3 2.51 3.24
copy constrructor
3.4 2.42451e-038 -2.61739e-019 3.20687e-041

我无法弄清楚为什么我会从复制构造函数中得到垃圾,有人可以帮忙吗?

【问题讨论】:

  • 这段代码应该在什么时候发生“深度复制”?
  • *ptr = *(d.ptr); 不会对数组进行深拷贝。它只是复制第一个元素。 ptr = input; 不会进行深拷贝,也不会进行浅拷贝,并导致您在此行之前在 ptr = new float; 中分配的单个浮点数的内存泄漏。
  • 这一行:“ptr = new float;”分配一个浮点数,下面的“ptr = input;”覆盖ptr,内存泄漏。请查看指针。
  • 另外,样板警告#include &lt;bits/stdc++.h&gt; 是一个非常危险的习惯(请参阅stackoverflow.com/questions/31816095/… )并且当您编写float input[size]; 时您使用的是非标准编译器扩展以及您可能真正想要的是float* input = new float[size];
  • 复制构造函数也应该正确地具有签名DataSequence(const DataSequence &amp;d)

标签: c++ arrays oop pointers constructor


【解决方案1】:

此声明:

ptr = new float;

只分配一个float。这意味着在这个循环中:

for(int i=0 ; i<_size; ++i){
    cout << *(ptr+i)

只要i 大于 0,您就会取消引用无效内存,这是未定义的行为。这导致程序可以做任何事情,包括产生你看到的“垃圾”输出。

如果你想分配一个数组,你需要这样做:

ptr = new float[_size];

要删除它,您需要这样做:

delete [] ptr;

请注意,即使您如上所示正确分配内存,您实际上并没有从参数中复制数据。只是设置指针会做一个浅拷贝,这不是你想要的。

你可以像这样做一个深拷贝:

std::copy(d.ptr, d.ptr + _size, ptr);

【讨论】:

  • 虽然std::vector&lt;float&gt; 可能是最好的选择。
  • @Eljay Always :) 但是 OP 明确表示他们想通过指针管理内存。
  • @cigien 我理解你的逻辑(不知何故我之前错过了这个),但是在构造函数和复制构造函数中分配数组的所述内存后,我仍然得到垃圾值,现在这真的是引人入胜
  • @drescherjm 你能告诉我你观察的原因吗?我确定我已经复制了有问题的指针,那么它怎么不是深拷贝呢?
  • @mikedirnt 我已经编辑了描述问题的答案和修复方法。
猜你喜欢
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多