理解C++中双指针和单指针内存分配之间的区别的问题

problems understanding difference between double and single pointer memory allocation in C++

本文关键字:指针 分配 内存 之间 问题 区别 C++ 理解 单指针      更新时间:2023-10-16

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

MyClass

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风格的编程,但我目前正在尝试这两种语言。

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;

首先,您有一个错误(整个事情之所以有效,是因为sizeof(MyClass(>=sizeof(MySlass*((:

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

是不正确的,应该是

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

MyClass** object = new MyClass*;

其次,您确实需要malloc(或new(,因为您需要双指针MyClass**来指向MyClass*的某个实例。您的第一个和第二个(更正后(示例的不同之处仅在于您获得MyClass*的地方——在第一个示例中,它在堆栈上,在第二个示例中它在堆上。

哦,当它在堆上时,您需要手动为指针调用free(((如果malloc((用于分配它(或delete(如果使用new(。

我删除了以前的答案。这就是初始化双指针的方法:

MyClass** object;
object = new MyClass*;
int i = funct(object);

第二行为MyClass的实例分配新指针,对funct的调用分配MyClass的实际对象。在该调用之后,object将指向指向MyClass的有效实例的有效指针。