指向类A的指针被传递给类B,但当B被删除时,A也是.如何保持A
pointer to class A is passed to class B, but when B is deleted, A is as well. How to keep A?
在Qt创建者的C++项目中,我有一个类Settings,它存储了我想在类应用程序中使用的一些设置(应用程序可以操作设置,删除应用程序后我需要这些更新的数据)。首先,我为每个类定义了一个指针,声明了它,并将Settings传递给App。
settings.h:
class Settings {
public:
Settings();
// ...
}
app.h:
class App {
public:
App(Settings *set);
private:
Settings *s;
// ...
}
app.cpp:
App::App(Settings *set){
s = set;
// manipulate s...
}
main.h
Settings* s;
App* a;
main.cpp
// ...
s = new Settings;
a = new App(s);
// ...
if(!aIsNeeded)
delete a;
// from here, s is deleted too
这很好,直到我再次需要具有相同设置的应用程序。当我打电话时a=新应用程序;有一个例外,因为s似乎也被删除了。
有更好的方法吗?为什么删除s?
谢谢你的回答!
编辑:问题是设置作为QWidget被添加到应用程序的ui中,因此成为应用程序的子项。我在delete ui;
:之前的a
的析构函数中添加了这一行,解决了这个问题
s->setParent(0);
谢谢你的提示!
默认情况下不应该发生这种情况。App
似乎有一个正在删除该指针的析构函数。
显然,成员在a
的析构函数中被释放,在这种情况下,由您定义Settings
的所有权。由于它是在App
之外创建的,我认为它的所有权不属于App
,所以App
不应该删除它。
当然,如果你使用智能指针,你就不会有这个问题。
相关文章:
- 我试图用c++编写递归fibonacci序列,但当我编译时,我遇到了一个错误
- 为什么当我'y'作为输入时会循环,但当我给出'n'时运行良好
- 程序编译,但当分解为函数时实际上不会移动电机
- 使用 swig 在 Python 中分段错误(核心转储),但当我更改变量名称时它可以工作
- 我的文件可以编译,但当我尝试运行它时"no such file or directory"
- 为什么我可以访问已删除但在C++中具有虚拟析构函数的对象?
- 矢量类型 字符串,但当用整数初始化时
- 当从一个应用程序调用时,在DLL方法中创建COM接口指针是有效的,但当从另一个应用软件调用时则无效
- QThread 中的 QTcpSocket 将提交事务,但当 Write 被调用时"Cannot create children for a parent that is in a different
- 我在检查字符串时得到"Invalid utf 8 error",但当我使用 std::cout 时似乎是正确的
- 当我使用可变参数时,它可以很好地处理int和double,但当涉及到float时,会发生错误
- 指向类A的指针被传递给类B,但当B被删除时,A也是.如何保持A
- POD变量的直接初始化不起作用,但当将变量推到向量上时,复制初始化起作用
- 运行时错误,当我运行程序,但当我使用调试器时没有
- 当我使用 scanf_s 时我得到 4,但当我使用 fgets() 时得到 1
- C++:二叉搜索树适用于整数,但当我尝试传递字符串时崩溃
- C++11:unique_ptr抱怨类型不完整,但当我包装它时却没有
- Getter工作了,但当我将其转换为常量时返回一个错误
- 为什么当用-O3编译时,这两个循环都运行得同样快,但当用-O2编译时却没有
- 创建了许多CCSprit,但当触发ccTouchBegan时,会给出最后一个