【c++智能指针介绍之auto_ptr】教程文章相关的互联网学习教程文章

【C++】智能指针(Smart Pointer)【代码】【图】

1. 传统指针存在的问题传统指针存在诸多的问题,比如指针所指向的对象的生命周期问题,挂起引用(dangling references),以及内存泄露(memory leaks). 如下是一个传统指针的使用过程void Foo() {int *iPtr = new int[5];// manipulate the memory block// ...// ...// ...delete[] iPtr; }以上代码将正常运行且内存将被合理释放,但是使用指针常会发生一些意想不到的事情,比如访问一个非法的内存单元,除0操作,以及根据一些判断条...

C++ 引用和指针【代码】

参数传递的本质是什么?参数的传递本质上是一次赋值的过程,赋值 <---> 对内存进行拷贝 <---> 将一块内存上的数据复制到另一块内存上C++禁止在函数调用时直接传递数组的内容,而是强制传递数组指针,而对于结构体和对象没有这种限制。引用是什么?引用可以看作是数据的一个别名,同个这个别名和原来的名字都能找到这份数据。引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其他数据,这有点类似于const变量(常量)...

C++二级指针第一种内存模型(指针数组)【代码】

二级指针第一种内存模型(指针数组)指针的输入特性:在主调函数里面分配内存,在被调用函数里面使用指针的输出特性:在被调用函数里面分配内存,主要是把运算结果甩出来 指针数组  在C语言和C++语言中,数组元素全为指针的数组称为指针数组。一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。  例如,一个一维指针数组的定义:int *ptr_array[10]。 如何理解指针数组   指针数组是数组元素为指针的数组,其...

C++ 必知必会:条款16 指向成员函数的指针并非指针【代码】

这一点与指向成员的指针类似,其实现可能更加复杂,因为成员函数同时还存在虚拟函数,需要动态绑定执行动作。当然这种属性是属于函数本身的,此处表达的是指针不涉及函数的属性问题。 1: class shape 2: { 3: public: 4: // void moveTo(point newLocation); 5: bool validate(); 6: //… 7: } 8: 9: class circle:: public shape 10: { 11: public: 12: //… 13: bool draw() const; 14: ...

C++中智能指针的设计和使用【代码】

大多数C++类用三种方法之一管理指针成员(1)不管指针成员。复制时只复制指针,不复制指针指向的对象。当其中一个指针把其指向的对象的空间释放后,其它指针都成了悬浮指针。这是一种极端(2)当复制的时候,即复制指针,也复制指针指向的对象。这样可能造成空间的浪费。因为指针指向的对象的复制不一定是必要的。(3) 第三种就是一种折中的方式。利用一个辅助类来管理指针的复制。原来的类中有一个指针指向辅助类,辅助类的数据成...

c++ shared_ptr储存this指针多次析构问题之enable_shared_from_this解决方案【代码】

#include <iostream> #include <memory> #include <cassert> /*//this //调用了两次析构函数,ParentPtr p(this);//智能指针出了作用域后就delete this ,析构了//所以错了,为了解决这个问题,就需要自身的类继承于 std::enable_shared_from_this<Type>//将ParentPtr p(this) 换成, shared_from_this();*/ class Parent; typedef std::shared_ptr<Parent> ParentPtr; typedef std::weak_ptr<Parent> WeakParentPtr;class Child : pub...

【C/C++学院】0816-引用包装器/仿函数/转义字符 R”()”/using别名/模板元编程 比递归优化/智能指针/多线程/静态断言以及调试技能的要求 assert

引用包装器 std::ref(变量)#include<iostream>template<class T> void com(T arg)//模板函数,引用无效,引用包装器 {std::cout <<"com ="<< &arg << "\n";arg++; }void main() {int count = 10;int & rcount = count;com(count);std::cout << count << std::endl;//std::ref(变量) ,函数模板,引用包装器//com(std::ref(count));com(rcount);std::cout << "main=" << &rcount << "\n";std::cout << count << std::endl;std::cin...

小猪猪逆袭成博士之C++基础篇(四)数组、指针、vector、迭代器【图】

小猪猪逆袭成博士之C++基础篇(四)关键词:数组,Vector。 一、数组与指针数组相信大家学过C语言或者其他的语言都不陌生,简单的就是同一个变量类型的一组数据。例如:int a[10],意思就是从a开始有10个连续的int大小的空间。我们还是从初始化说起。我们以数据类型int为例,当然也可由有很多的数据类型,可以是像int,double这种,也可以是自定义的类,一般的初始化方法有:int a[10];int a[10]={0};int a[3]={0,1,2};在前面的文章...

c++ 智能指针及 循环引用问题

c++智能指针介绍由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见,并造成内存泄露。如此c++引入智能指针 ,智能指针即是C++ RAII的一种应用,可用于动态资源管理,资源即对象的管理策略。智能指针在 <memory> 标头文件的 std 命名空间中定义。 它们对 RAII 或获取资源即初始化编程惯用法至关重要。RAI...

C++ 自动指针 共享指针【代码】

#include <iostream> #include <string> #include <memory> class Item { public:Item(std::string str):name(str){}~Item(){std::cout<< name << " unitialize!" <<std::endl;}void dump(){std::cout<< "I‘am " << name <<std::endl;}static Item *CreateItem(std::string str){Item *pItem = new Item(str);return pItem;} private:std::string name; };int main() {Item *pi = Item::CreateItem("common ptr");pi->dump();dele...

C++ 之 指针详解篇(一)【代码】

C++的指针太重要了,我们有必要去掌握它。所以必须认真的对待指针。先来讲解什么是指针。(重点掌握)  指针是存储内存地址的变量,内存又是什么?内存是干啥用的?简单的说,就是存储一些二进制数据,它是按一定的顺序存储的线性单元结构。那一个数据又是如何存储在内存的呢?这些问题都是汇编的基础知识,如果你学过汇编理解这真的不是难事。闲话越扯越远了,通常数据的存储在内存地址中,不同的计算机它的地址也会不同。假设我们...

C++学习杂谈1(extern、cosnt引用&指针)

extern的用法:.cpp 1#include <iostream>using namespace std;extern int i;int main(int argc, char** argv) { cout << i << endl; return 0;}.cpp 2#include <iostream>int i = 100;注意:在测试的时候.cpp 2没有加头文件#include<iostream> 导致编译报错。另外的:const限定符除了将其修饰的对象变为常量对象外,还有其他的特点:1,因为const对象一旦创建后其值就不能改变,所以const对象必须初始化。2,默认状态下,const对象...

c++函数指针说明【代码】

下面随笔说明函数指针用法。函数指针的定义:  定义形式:  存储类型 数据类型 (*函数指针名)()  含义:  函数指针指向的是程序代码存储区函数指针的典型用途-----实现函数回调  通过函数指针调用的函数    例如将函数的指针作为参数传递给一个函数,使得在处理相似事件的时候可以灵活的使用不同的方法。  调用者不关心谁是调用者    需知道存在一个具有特定原型和限制条件的被调用函数。函数指针举例 1 #inc...

c++指针实例【代码】

#include <iostream>usingnamespace std;int main () {intvar = 20; // 实际变量的声明int* ip; // 指针变量的声明ip = &var; // 在指针变量中存储 var 的地址 cout << "Value of var variable: ";cout << var << endl; //20,因为ip等于的是var的地址,所以var值不变,仍旧是20int** b=&ip; //把一个指针的地址给b赋值,那么b指向的地址里应该是放了一个地址,这个地址指向var,也就是20cout << "Value of i...

C++字符串指针与字符数组的区别【代码】

今天发现这样一个问题#include <iostream> usingnamespace std; int main() { char ch1[10];strcpy_s(ch1,"123456");//编译通过char* p = newchar[10];strcpy_s(p,"123456");//报错:不接受2个参数 }改成如下所示就没有问题:strcpy_s(p,10,"123456");//编译通过为什么会这样呢?先看下字符数组与字符串指针的区别:1.由双引号括起来的字符串常量属于静态存储类型,它被存储在内存的静态存储区内,所以无论字符串常量出现在程序的什...