首页
学习
活动
专区
圈层
工具
发布

经推介
EN

Software Engineering用户
提问于 2016-07-08 15:18:10
回答 2查看 1.2K关注 0票数 1

我试图理解C++中的指针和引用的概念。我被困在以下几个问题上,在这种情况下,具体的行为是什么?我有这样一门课:

代码语言:javascript
复制
class MyClass{
public:
     MyClass(const QByteArray & raw){
        this->m_rawData =raw;
     }
private:
   QByteArray m_rawData;
}

假设我创建了这样的实例:

代码语言:javascript
复制
bool otherClass::someOtherMethod(){
    QByteArray data = QString("sometext").toUtf8();
    MyClass instance = new MyClass(data);
    return true;
}

我将data变量地址传递给类构造函数,然后退出OtherClass的本地方法。QByteArray data将会被摧毁,它的记忆也会被释放,对吗?但是MyClass instance会发生什么呢?这个会吗?

代码语言:javascript
复制
 MyClass(const QByteArray & raw){
            this->m_rawData =raw;
         }

实际上,将raw的内容复制到m_rawData中,还是会复制raw的实际引用,当otherClass::someOtherMethod返回时m_rawData将变得无效?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2016-07-17 11:08:56

在引擎盖下,它可能以不同的方式实现,但其明显的效果是

代码语言:javascript
复制
MyClass(const QByteArray & raw){
        this->m_rawData =raw;
}

raw的内容复制到m_rawData中,并在raw被销毁后存活下来。

这是因为m_rawData被声明为QByteArray类型的值。如果它是一个指针或一个引用,那么如果rawm_rawData之前被破坏,那么它就会在空中悬空。

在C++中需要记住的一件重要事情是,除非显式地将其作为指针或引用,否则一切都是值。

票数 6
EN

Software Engineering用户

发布于 2016-07-25 16:49:21

..。将raw的内容复制到m_rawData中,或者它将复制raw的实际引用,当其他类::someOtherMethod返回时,m_rawData将变得无效?

代码语言:javascript
复制
this->m_rawData =raw;

可能会触发QByteArray上的复制赋值操作符。这是因为您没有在初始化器块中初始化m_rawData,因此很可能调用QByteArray上的默认构造函数来初始化m_rawData。在此之后,在ctor中,您将通过复制分配将数据内容分配给m_rawData。

默认的副本赋值操作符可能是:

代码语言:javascript
复制
QByteArray &operator=(const QByteArray& other) {
  return *this;
}

它为此分配其他值。但是,编译器生成的赋值操作符很可能只返回一个指针,该指针可能将QByteArray中的所有值作为垃圾,而实际上没有任何值被复制。(这是在实践中“删除”所有编译器生成的类方法的好理由)

要解决这个问题,需要在QByteArray上设置一个有效的副本赋值操作符。

此外,还包括:

代码语言:javascript
复制
bool otherClass::someOtherMethod(){
    QByteArray data = QString("sometext").toUtf8();
    MyClass instance = new MyClass(data);  // leak!
    return true;
}  

应该拥有记忆。如果坚持使用动态内存,请执行以下操作:

代码语言:javascript
复制
bool otherClass::someOtherMethod(){
    QByteArray data = QString("sometext").toUtf8();
    std::unique_ptr<MyClass> fixed(new MyClass(data));
    return true;
}

因此,QByteArray数据将被销毁,其内存将被释放,对吗?

一旦原始堆栈变量“数据”超出作用域,它将触发它的析构函数。

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

https://softwareengineering.stackexchange.com/questions/324372

复制
相关文章

相似问题

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