使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。 理解智能指针需要从下面三个层次: (1)从较浅的层面看,智能指针是利用了一种叫做RAII(资源获取即初始化)的技术对普通的指针进行封装,这使得智能指针实质是一个对象,行为表现的却像一个指针。
智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。 每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个...
Aliasing constructor,简单说就是构造出来的 shared_ptr 对象和参数 r 指向同一个控制块(会影响 r 指向的资源的生命周期),但是指向共享资源的指针是参数 ptr。看下面这个例子。 usingVec =std::vector<int>;std::shared_ptr<int> GetSPtr() {autoelts = {0,1,2,3,4};std::shared_ptr<Vec> pvec =std...
1unique_ptr<int> make_int(intn)2{3returnunique_ptr<int>(newint(n));4}5voidshow(unique_ptr<int> &p1)6{7cout << *a <<'';8}9intmain()10{11...12vector<unique_ptr<int> >vp(size);13for(inti =0; i < vp.size(); i++)14vp[i] = make_int(rand() %1000);//copy tempor...
#include <vector> #include <algorithm> #include <functional> using namespace std; using namespace boost; //绑定函数的默认值,继承二进制函数类的全部类容 class add:public std::binary_function<int ,int,void> { public: void operator()(int i,int j) const ...
(chrarray);//auto_ptr并不可帮你管理数组资源no2.vectorauto_ptrxm_VECsmptr;m_VECsmptr.push_back(auto_ptrint(newint(100)));//auto_ptr并不适合STL内容.no3.constauto_ptrxm_SMPTR1(newx(100));auto_ptrxm_SMPTR(newx(200));no4.m_OBJx(300);auto_ptrxm_SMPTR(&m_OBJx);no5newx(...
1. 智能指针 (Smart Pointers):智能指针是一种对象,它像常规指针一样存储对象的地址,但当智能指针的生命周期结束时,它会自动删除它所指向的对象。这种自动管理内存的能力使得智能指针成为防止内存泄漏的重要工具。C++11引入了三种类型的智能指针: shared_ptr:这是一种引用计数的智能指针。当没有任何shared_ptr指向一...
还有一个例子,Java 中往容器中放对象,实际放入的是引用,不是真正的对象,而 C++ 在 vector 中 push_back 采用的是值拷贝。如果想实现 Java 中的引用语义,就应该使用智能指针,可以参考《C++ 标准库程序》(侯捷/孟岩 译)的第五章讲容器的部分,有一节叫做 "用 Value 语义实现 Reference 语义",还有陈硕的那本《...
引入了nullptr来替代原来的NULL,避免了在指针操作中的一些潜在问题。 Copycodeint* ptr =nullptr; 8、初始化列表 引入了初始化列表语法,使得初始化更加直观和简洁。 std::vector<int>numbers = {1,2,3,4,5}; 9、强类型枚举(enum class) 引入了更严格的枚举类型,避免了传统枚举类型带来的一些问题,使得代码更...
// 字符串字面量通常存储在程序的只读数据段中,不应该被释放或修改。 char* string = "www.dotcpp.com"; // strdup函数返回指向新分配的内存空间的指针,如果空间不足则返回 NULL。 char* dup_str = strdup(string); printf("%s\n", dup_str); ...