首先要考虑为什么使用指针,为什么不用引用;其次,无法避免使用指针的情况下,对于new出来的指针用智能指针。
(1)实现多态
虽然大多数程序员会使用指针去实现,其实可以使用引用
class BaseObj { public: BaseObj() {}; virtual void printType() = 0; }; class AObj :public BaseObj { public: AObj() {}; void printType() override { cout << "AObj"<<endl; } }; class BObj :public BaseObj { public: BObj() {}; void printType() override { cout << "BObj" << endl; } }; void printObj(BaseObj* pObj) { pObj->printType(); } void printObj(BaseObj& obj) { obj.printType(); } int main() { AObj a; BObj b; printObj(&a); printObj(&b); printObj(a); printObj(b); }
(2)需要使用堆空间:
堆空间:空间较大,可以共享,分配速度较慢,需要程序员自己管理,有内存泄漏的风险
栈空间:空间较小,系统管理,分配速度较快,有溢出的风险
class MyClass { public: MyClass() {} }; int main() { MyClass* p = new MyClass();//堆 unique_ptr<MyClass> sPtr = make_unique<MyClass>();//堆 MyClass cls{};//栈 delete p; }
那上述到底是选用堆还是栈呢?需要考虑MyClass的大小。window给每个线程分配的栈空间默认是1M。
如下图,会出现如下的提示:
应该使用智能指针代替裸指针在堆上分配:
class MyClass { public: MyClass() {} double arr[100000000]; }; int main() { unique_ptr<MyClass> sPtr = make_unique<MyClass>();//堆 return 0; }
当然堆上的空间也不是无限的,还是要合理设计(模块化设计、避免太深的递归等)。
(3)大小是动态的
请使用STL的容器