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

时间:2015-06-02 14:53:42

标签: c++ c pointers allocation

好的,这里有2个简单的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风格的编程,但我目前正在试验这两种语言。

3 个答案:

答案 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实例的有效指针。