好的,这里有2个简单的C ++示例,第一个是:
class MyClass
{
private:
int test;
public:
int member(){
test = 456;
return 1;
} // one public function
};
int funct(MyClass** obj)
{
*obj = new MyClass();
int c = (**obj).member();
return 1;
}
...
MyClass* object;
int i = funct(&object);
...
而在第二种情况下,我像这样修改主要:
MyClass** object = (MyClass **)malloc(sizeof(MyClass));
int i = fun(object);
两个例子都运行正常,但我不确定我是否理解为什么只有在第二种情况下我需要一个malloc(否则它根本不会编译)。
提前感谢您的帮助
PS:我知道双指针是更多C风格的编程,但我目前正在试验这两种语言。答案 0 :(得分:1)
MyClass** object = (MyClass **)malloc(sizeof(MyClass));
实际上这是错误的,malloc
将返回指向已分配内存的指针:MyClass *
,所以如果您稍后执行:*object
并希望看到指向MyClass
的指针你会错的。你应该宁愿:
MyClass* pobject = (MyClass *)malloc(sizeof(MyClass));
MyClass** ppobject = &pobject ;
你的问题对我来说还不清楚 - 抱歉,用malloc分配clases是不明智的 - 你的看起来像它的POD - 所以它似乎是安全的,但我会用std :: is_pod检查它。
[编辑]
工作示例如下。您问为什么在第二种情况下需要初始化object
,这是因为在第一种情况下,您只需通过定义指针变量MyClass* object;
来保留指针的存储空间。 object
可以安全地使用funct
。在第二个示例中,您没有为MyClass指针保留内存(在本例中为堆栈空间),因此必须使用malloc或new分配它。希望这很清楚。
MyClass** object = (MyClass **)malloc(sizeof(MyClass*));
//MyClass** object = new MyClass*;
int i = funct(object);
delete *object;
free(object);
//delete object;
答案 1 :(得分:0)
首先,你有一个错误(整个过程只有因为sizeof(MyClass)> = sizeof(MyClass *)):
MyClass** object = (MyClass **)malloc(sizeof(MyClass));
不正确,应该是
MyClass** object = (MyClass **)malloc(sizeof(MyClass*));
或
MyClass** object = new MyClass*;
其次,你确实需要malloc()(或new),因为你需要你的双指针MyClass **指向一些MyClass *的实例。你的第一个和第二个(校正后)示例的区别仅在于你获得这个MyClass *的方式 - 在第一个例子中它是在堆栈上,在第二个例子中它在堆上。
哦,当它在堆上时,你需要手动调用free()(如果使用malloc()来分配它)或删除(如果使用new)指针。
答案 2 :(得分:0)
我删除了之前的回答。这是你应该如何初始化双指针:
MyClass** object;
object = new MyClass*;
int i = funct(object);
第二行分配一个指向MyClass
实例的新指针,对funct
的调用分配一个MyClass
的实际对象。在此调用之后,object
将指向指向有效MyClass
实例的有效指针。