【问题标题】:Program crashing when accessing shared_ptr holding QString访问持有 QString 的 shared_ptr 时程序崩溃
【发布时间】:2017-02-08 13:05:52
【问题描述】:

我正在测试 shared_ptrs 和 QStrings,但我遇到了一个我不完全理解的崩溃。代码如下:

#include <QCoreApplication>
#include <QString>

#include <iostream>

class Base {
 public:
  Base(const QString& str1, const QString& str2, const QString& str3) {
   member1_ = std::make_shared<Internal>();
   (*member1_).i1 = str1;
   (*member1_).i2 = str2;
   member2_ = std::make_shared<QString>(str3);
 }
 QString getMember() { return *member2_; }
 QString getInternalMember() { return (*member1_).i1; }
protected:
 Base(const Base&) = default;
 Base& operator=(const Base&) = default;
 Base(Base&&) = default;
 Base& operator=(Base&&) = default;

private:
 struct Internal {
  QString i1;
  QString i2;
 };
 std::shared_ptr<Internal> member1_;
 std::shared_ptr<QString> member2_;
};

class Derived : public Base {
 public:
  Derived(const QString& str1, const QString& str2, const QString& str3) : Base(str1, str2, str3) {
   derivedMember_ = 1;
  }
 private:
  int derivedMember_;
};

int main(int argc, char *argv[]) {
 QCoreApplication a(argc, argv);
 Derived* d1 = new Derived("param1", "param2", "param3");
 std::cout << "d1 created " << d1->getMember().toStdString() << "-" << d1->getInternalMember().toStdString() << std::endl;
 Derived* d2 = d1;
 delete d1;
 std::cout << "d2 created " << d2->getMember().toStdString() << "-" << d2->getInternalMember().toStdString() << std::endl;
 return a.exec();
}

为什么会崩溃?我正在使用 shared_ptrs 所以在分配引用计数器应该增加之后。

提前致谢

【问题讨论】:

  • 复制的是指针,而不是对象。
  • 由于 QString 使用COW,因此不清楚您为什么会处于这种情况。首先在这里使用智能指针没有什么价值——更不用说指针了。
  • @MrEricSir 我希望 QString 对于所有复制的对象都相同。即使 QString 使用纯指针使用 COW,如果我对其进行修改,它也会被复制并且对象将具有不同的值

标签: c++ qt pointers shared-ptr qstring


【解决方案1】:

d2 和 d1 指向同一个对象,你删除对象然后尝试调用它的方法(删除后)

【讨论】:

  • 在这种情况下,如果我将 QString 更改为 int,它不会崩溃吗?
  • 这是未定义的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多