【发布时间】:2015-05-04 09:25:27
【问题描述】:
一般来说,我总是通过我创建的任何对象的函数传递指针;如果我需要对一个对象做些什么,我会通过指针而不是引用传递它。这只是一种编程习惯,有些人可能将其描述为微不足道。但这是我必须举例问的地方:
class someObject
{
public:
someObject();
~someObject();
void do(const char* smth)
{
cout << smth << endl;
}
private:
};
class doObject
{
public:
doObject();
~doObject();
void takeObject(someObject *so)
{
pObject = so;
so->do("Hi");
}
private:
someObject *pObject;
}
在 main.cpp 中:
int main()
{
someObject *so = new someObject();
so->do();
doObject *do = new doObject();
do->takeObject(so);
delete so;
delete do;
}
是否应该在为 doObject::pObject 分配指针参数 so 类型为 someObject 之前为其分配内存?
如果pObject被赋值为上述参数,是否应该删除;例如删除 pObject?
在 main.cpp 中 someObject 在 doObject 之前被删除。理解这一点至关重要,因为 doObject 有一个名为 pObject 的 someObject 分配。在 doObject 之前删除 someObject 意味着有一个悬空指针,这意味着对它的任何操作都会产生分段错误。
如果我首先在 main.cpp 中删除 doObject,是否也会删除 pObject 以及 someObject 类型的“so”?毕竟,它们是联系在一起的。
如果我创建一个新类,该类也是一个还需要 someObject 参数的函数,这是否意味着 pObject 不再指向“so”?我是否应该改用共享指针,以便两个类都可以指向“so”并根据需要更改对象?
如何改进代码?我是否应该考虑使用智能指针来确保我不会在程序的各个部分多次删除一个对象?
是的,这个问题相当复杂;但这就是你用指针得到的!
【问题讨论】:
-
这是一个问题中的很多问题。另外:你不能调用方法或变量do,它是一个关键字。始终确保像这样的简短示例至少可以编译......否则它会掩盖对话!
-
使用智能指针避免自己管理内存。
-
@Poriferous “是的,这个问题相当复杂;” 不,这个设计看起来相当有缺陷。 “但这就是你用指针得到的!” 没错。您不会在严肃的 C++ 编程中使用它们。
-
神圣的汉娜!请每个问题一个 问题。线索就在“问题”这个词中......
-
所有问题都捆绑在一起;这比发送所有相关的垃圾邮件问题要好。我确实在问题中输入了“等等”。不管怎样,我会尝试用智能指针改进代码,看看效果如何。
标签: c++ function pointers memory memory-management