首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制用于非动态分配的构造函数

复制用于非动态分配的构造函数
EN

Stack Overflow用户
提问于 2013-11-19 12:27:36
回答 3查看 622关注 0票数 2

根据定义:当复制该类的对象时,指针成员被复制,而不是指向缓冲区,从而导致两个对象指向相同的,因此我们使用复制构造函数。

但是在下面的类中,没有复制构造函数,但它可以工作!为什么?为什么我不需要深抄?

代码语言:javascript
复制
class Human
{
private:
    int* aValue;

public:
    Human(int* param)
    {
        aValue=param;
    }

    void ShowInfos()
    {
        cout<<"Human's info:"<<*aValue<<endl;
    }
};

void JustAFunction(Human m)
{
    m.ShowInfos();
}

int main()
{
    int age = 10;
    Human aHuman(&age);
    aHuman.ShowInfos();
    JustAFunction(aHuman);
    return 0;
}

产出:

人类信息: 10 人类信息: 10

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-19 12:43:23

正如前面提到的,它对您有效的原因是,实际上让多个指针指向同一个对象是很好的--这就是要点之一,共享数据而不复制它。

如果指向的对象的生存期由包装类管理,即:它是在类实现的方法(通常是类的构造函数和析构函数)中创建和销毁的,那么问题就出现了。在这种情况下,复制构造函数中需要一个深拷贝

在您(诚然是人为的)示例中,int具有更长的生存期,而携带指针的对象应该使用引用作为成员进行检查,并在初始化列表中初始化。这消除了忘记自己和从类中删除对象的可能性。

代码语言:javascript
复制
class Human
{
private:
    int& aRef;

public:
    Human(int& param)
    : aRef(param)
    {
    }
};

还应考虑指针或引用是否应该指向const对象:

代码语言:javascript
复制
class Human
{
private:
    const int& aRef;

public:
    Human(const int& param)
    : aRef(param)
    {
    }
};
票数 3
EN

Stack Overflow用户

发布于 2013-11-19 12:30:40

当您的类拥有资源时,复制构造函数非常有用。在您的例子中,它没有-它既不创建也不删除aValue本身。

如果你确实这么做了,就说:

代码语言:javascript
复制
Human()
{
    aValue=new int;
}

适当地清理了记忆:

代码语言:javascript
复制
~Human()
{
    delete aValue;
}

然后就会遇到问题,因为Human a;Human b(a);会让成员aValue指向同一个位置,当它们超出作用域时,会释放相同的内存,从而导致双重删除。

票数 6
EN

Stack Overflow用户

发布于 2013-11-19 12:31:11

这是因为类中的指针指向堆栈变量age

您还没有为类Human编写析构函数,所以在Human被复制到JustAFunction中时,不要尝试执行双重删除

如果您以不同的方式使用它,例如将一个newed int发送到类中,则会出现内存泄漏。

代码语言:javascript
复制
Human human(new int);

如果复制,就会有两个指向同一内存的指针,这本身并不是问题,但很难确定是谁负责释放该内存。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20071572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档