关于C++中Point *newpoint = newpoint;代码的作用及写法疑问
问题解答与分析
一、Point *newpoint = newpoint;的本质:完全错误的代码
这段代码是未定义行为,没有任何合理作用,属于明显的错误写法:
- 局部指针变量
newpoint在声明时还未完成初始化,此时它的值是栈上的随机垃圾数据。 - 用这个未初始化的垃圾值给自己赋值,最终
newpoint会指向一个完全未知的内存地址。 - 后续执行
newpoint->x = value和(*newpoint).x时,相当于直接操作非法内存,会导致程序崩溃、数据损坏或其他不可预测的结果。
二、你提到的替代写法的分析与注意事项
你给出的写法:
Point newpoint1; Point *newpoint = &newpoint1;
是语法合法的,但存在生命周期的隐患:
newpoint1是局部对象,存储在栈上,当insert函数执行完毕后,这个对象会被自动销毁。- 如果后续还需要使用指针
newpoint,它就会变成野指针(指向已释放的内存),再次访问同样会触发未定义行为。
三、正确的写法建议
如果需要在函数内创建一个Point对象并通过指针操作,分两种场景选择:
- 仅在函数内部使用对象:直接用局部对象即可,无需指针
void insert(int value){ Point newpoint1; newpoint1.x = value; cout << "newpoint val: " << newpoint1.x << endl; }
- 需要对象在函数结束后仍然存在:使用动态内存分配(记得后续要释放内存,避免内存泄漏)
void insert(int value){ Point *newpoint = new Point; // 在堆上分配内存 newpoint->x = value; cout << "newpoint val: " << newpoint->x << endl; // 注意:后续需要在合适的地方调用 delete newpoint; 释放内存 }
内容的提问来源于stack exchange,提问作者YOUNG
相关产品推荐
相关产品推荐

