如果我按以下方式创建节点
struct node
{
char *ptr = (char *)malloc(sizeof(char));
}*current;
void main()
{
node *temp = new node();
current = temp;
}
以上代码会自动将current->ptr
设置为指向temp->ptr
指向的位置吗?
答案 0 :(得分:3)
struct node
{
char *ptr = (char *)malloc(sizeof(char)); // INVALID
} *current;
首先,你不应该混合使用内存模型。如果您使用的是new
,请坚持使用new
。请勿在{{1}}和new
之间跳转。
其次,这不是有效的C ++。您不能声明一个类成员并调用一个函数来在声明中初始化它(除非您使用的是C ++ 11的新功能)。更新它以清理它看起来像:
malloc
另请注意,在这种情况下,struct node
{
char* ptr; // declare the pointer
node() : ptr(new char) { } // initialize the pointer in the constructor
// NOTE: should also add a copy constructor and copy-assignment operator here
~node()
{
delete ptr; // free the memory in the destructor
}
};
int main() // NOTE that main must return an int, not void
{
node current = new node();
node temp = *current; // will do a shallow copy
// ...
delete current;
// PROBLEM - temp now has a dangling pointer!
return 0;
}
没有必要成为指针。由于您只是动态分配单个ptr
,因此您只需使用自动:
char
上面的代码会自动将current-> ptr设置为指向哪里 temp-> ptr指向
您拥有的代码甚至无法编译,但如果您进行了修复,则默认的复制赋值运算符将执行浅拷贝。在使用指针的情况下,这意味着您有两个指向同一内存位置的对象。因为他们都假设他们拥有它,当其中一个人摧毁它时,另一个人留下一个悬垂的指针。
答案 1 :(得分:1)
当前和临时参考记忆中的同一个地方。所以实际上current-> ptr 是 temp-> ptr。
答案 2 :(得分:1)
在此语句之后使用赋值运算符
current = temp;
current和temp将具有相同的值。此值是分配它的节点类型对象的地址。因此,两个指针指向对象占用的相同内存。对象本身未被复制或移动。
Operator new返回分配对象而不是对象本身的内存地址。所以在这个声明之后
node *temp = new node();
变量temp将具有此地址并且在
之后current = temp;
current和temp都将存储此地址。
答案 3 :(得分:0)
是的,current->ptr
和temp->ptr
指的是相同的内存地址。通过node* temp = new node()
实例化节点对象时,临时指针指向新分配的存储。通过current
分配current = temp
指针只会使当前指向该内存位置。请注意,current
指向的对象仍然存在于内存中的其他位置(以及MAX大小的字符数组),因为我们还没有释放该内存。此外,指针赋值不会复制对象 - 它只是使指针指向不同的内存位置。实际上,引用current
和temp
指向的对象的任何成员将返回相同的值 - 无论它们是指针还是其他类型。
您的代码目前无效,无法编译。这是您打算做的固定版本。
#include<cstdlib>
#include<cstdio>
#define MAX 10
struct node
{
char* ptr;
node()
{
ptr = new char[MAX]; // Do not use malloc if using new elsewhere.
}
}*current;
int main()
{
struct node* temp = new struct node();
current = temp;
// The pointer addresses will be the same.
printf("Current->ptr=%p, temp->ptr=%p\n", (void*)current->ptr, (void*)temp->ptr);
return 0;
}