gpt4 book ai didi

c++ - 理解 C++ 中双指针和单指针内存分配之间差异的问题

转载 作者:行者123 更新时间:2023-11-28 06:14:31 26 4
gpt4 key购买 nike

好的,这里我有 2 个简单的 C++ 示例,第一个是:

我的类(class)

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);
...

而在第二种情况下,我将 main 修改为:

MyClass** object = (MyClass **)malloc(sizeof(MyClass));
int i = fun(object);

这两个示例都工作正常,但我不确定我是否理解正确,为什么只有在第二种情况下我才需要一个 malloc(否则它根本无法编译)。

预先感谢您的帮助

PS:我知道双指针更像是 C 风格的编程,但我目前正在尝试使用这两种语言。

最佳答案

MyClass** object = (MyClass **)malloc(sizeof(MyClass));

实际上这是错误的,malloc 将返回指向已分配内存的指针:MyClass *,因此如果您稍后执行:*object 并且会喜欢看到指向 MyClass 的指针你会错的。你应该:

MyClass* pobject = (MyClass *)malloc(sizeof(MyClass));
MyClass** ppobject = &pobject ;

我不清楚你的问题 - 抱歉,用 malloc 分配类也是不明智的 - 你的看起来像它的 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;

关于c++ - 理解 C++ 中双指针和单指针内存分配之间差异的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30599526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com