理解C++中双指针和单指针内存分配之间的区别的问题
problems understanding difference between double and single pointer memory allocation in C++
好的,这里我有两个简单的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
的有效实例的有效指针。
- 将指针分配给另一个指针时会发生什么情况?
- C++将一个指针分配给另一个指针时执行的类型检查
- 我似乎无法为指针分配一个数组,然后更改数组的内容
- C++为 void 指针分配一个字符串
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- MPI 集合通信中的指针分配
- 函数指针分配在创建 DLL 后导致错误
- 通过双指针分配指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- 我可以直接为指针分配地址吗?如果是,如何做到这一点
- 为什么为char指针分配内存不会截断char序列
- C++指针分配字符数组的地址
- 将 void 指针分配给另一个 void 指针
- 如何将不同的成员函数指针分配给注册类的不同实例?
- 如何为指针分配特定的内存地址?
- C++ - 无法将顶部常量指针分配给另一个非常量指针
- 将指针分配给另一个指针时会发生什么情况?
- 为指向C++中的对象/对象的指针分配堆内存
- 将指针分配给字符串变量中包含的地址
- 当直接分配时,为什么此功能指针分配起作用,而不是与有条件的操作员一起使用