理解 C++ 中双指针和单指针内存分配之间差异的问题
problems understanding difference between double and single pointer memory allocation in C++
好的,这里我有 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);
...
而在第二种情况下,我将 main 修改为:
MyClass** object = (MyClass **)malloc(sizeof(MyClass));
int i = fun(object);
这两个例子都工作正常,但我不确定我是否理解正确为什么只有在第二种情况下我需要一个 malloc(否则它根本不会编译)。
提前感谢您的帮助
PS:我知道双指针更像是 C 风格的编程,但我目前正在尝试两种语言。
MyClass** object = (MyClass **)malloc(sizeof(MyClass));
实际上这是错误的,malloc
将 return 指向已分配内存的指针:MyClass *
,因此如果您稍后执行:*object
并希望看到一个指针to MyClass
你会错的。你应该:
MyClass* pobject = (MyClass *)malloc(sizeof(MyClass));
MyClass** ppobject = &pobject ;
我不清楚你的问题 - 抱歉,用 malloc 分配类也是不明智的 - 你的看起来像它的 POD - 所以它似乎是安全的,但我会用 std::is_pod 检查它.
[编辑]
工作示例如下。您问为什么在第二种情况下需要初始化 object
,那是因为在第一种情况下您通过简单地定义指针变量来为指针保留存储空间:MyClass* object;
。这里 object
可以安全地用在 funct
中。在第二个示例中,您没有为指向 MyClass 的指针保留内存(在本例中为堆栈上的 space),因此您必须使用 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(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)。
我删除了之前的回答。这就是你应该如何初始化双指针:
MyClass** object;
object = new MyClass*;
int i = funct(object);
第二行分配了一个指向MyClass
实例的新指针,而对funct
的调用分配了一个MyClass
的实际对象。在此调用之后,object
将指向指向 MyClass
.
的有效实例的有效指针
好的,这里我有 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);
...
而在第二种情况下,我将 main 修改为:
MyClass** object = (MyClass **)malloc(sizeof(MyClass));
int i = fun(object);
这两个例子都工作正常,但我不确定我是否理解正确为什么只有在第二种情况下我需要一个 malloc(否则它根本不会编译)。
提前感谢您的帮助
PS:我知道双指针更像是 C 风格的编程,但我目前正在尝试两种语言。
MyClass** object = (MyClass **)malloc(sizeof(MyClass));
实际上这是错误的,malloc
将 return 指向已分配内存的指针:MyClass *
,因此如果您稍后执行:*object
并希望看到一个指针to MyClass
你会错的。你应该:
MyClass* pobject = (MyClass *)malloc(sizeof(MyClass));
MyClass** ppobject = &pobject ;
我不清楚你的问题 - 抱歉,用 malloc 分配类也是不明智的 - 你的看起来像它的 POD - 所以它似乎是安全的,但我会用 std::is_pod 检查它.
[编辑]
工作示例如下。您问为什么在第二种情况下需要初始化 object
,那是因为在第一种情况下您通过简单地定义指针变量来为指针保留存储空间:MyClass* object;
。这里 object
可以安全地用在 funct
中。在第二个示例中,您没有为指向 MyClass 的指针保留内存(在本例中为堆栈上的 space),因此您必须使用 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(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)。
我删除了之前的回答。这就是你应该如何初始化双指针:
MyClass** object;
object = new MyClass*;
int i = funct(object);
第二行分配了一个指向MyClass
实例的新指针,而对funct
的调用分配了一个MyClass
的实际对象。在此调用之后,object
将指向指向 MyClass
.