将指针传入C++类方法后赋值无效的问题排查
问题分析与解决方案
嘿,这个问题其实是C++里很常见的值传递陷阱,我来给你拆解清楚:
核心问题:指针也是按值传递的
你现在的search方法参数是int* a,这里的a其实是你传入的test指针的副本。当你在方法里执行a = test;时,只是修改了这个局部副本的指向,完全不会影响外面的test指针本身。所以方法调用结束后,外面的test还是原来的NULL。
两种可行的解决方案
方案1:使用指针的指针(int**)
把方法的参数改成指针的指针,这样就能通过间接引用修改外部指针的指向:
修改后的代码:
#include <iostream> using namespace std; class MyObject { public: bool search(int** a) { // 改成int**类型参数 int* test = new int(23); *a = test; // 通过指针的指针修改外部指针的指向 return true; } }; MyObject* obj; void search() { int* test = NULL; obj->search(&test); // 传入指针的地址 cout << test << endl; // 现在会输出新分配的内存地址 delete test; // 记得释放内存,避免泄漏 } int main(int argc, char *argv[]) { obj = new MyObject(); search(); delete obj; // 释放MyObject实例 }
方案2:使用指针的引用(int*&)
这是更简洁的方式,直接把参数声明为指针的引用,这样方法里操作的就是外部指针本身:
修改后的代码:
#include <iostream> using namespace std; class MyObject { public: bool search(int*& a) { // 改成指针的引用 int* test = new int(23); a = test; // 直接修改外部指针的指向 return true; } }; MyObject* obj; void search() { int* test = NULL; obj->search(test); // 直接传原指针即可 cout << test << endl; delete test; // 释放内存 } int main(int argc, char *argv[]) { obj = new MyObject(); search(); delete obj; }
额外提醒
代码里还有个容易忽略的点:你用new分配了内存,但没有对应的delete操作,会造成内存泄漏,我在上面的示例里已经补上了,实际开发中一定要注意内存管理哦~
内容的提问来源于stack exchange,提问作者agajvery
相关产品推荐
相关产品推荐

