由于之前也只是了解智能指针,要我说估计只能说个它是干什么的,用不了几分钟。
昨天花了一天时间各种百度,算是对智能指针有了一点了解,这篇文章基本就是这次分享会的PPT的copy,没有底层的东西,多是概念。
我觉得理解智能指针需要了解它发展的三个过程:起因,经过,结果。这篇文章主要讲述的是起因,经过和结果等以后工作了,实际接触了再说吧。
<pre name="code" class="cpp">//内存泄露
#include <stdio.h>
#include <iostream>
using namespace std;
class A
{
public:
A(char *cstr);
A(const A &ca);
A();
~A();
A operator=(const A &ca);
private:
char *str;
};
A::A(char *cstr)
{
str = new char[20];
strcpy(str, cstr);
}
A::A(const A &ca)
{
str = new char[20];
strcpy(str, ca.str);
}
A A::operator=(const A &ca)
{
str = new char[20];
strcpy(str, ca.str);
return str;
}
A::A() : str(new char[20])
{
strcpy(str, "Welcome!");
}
A::~A()
{
delete[] str;
str = NULL;
}
int main(void)
{
A a("Hello world!");
A b(a);
A c;
c = b;
return 0;
}
#include <stdio.h>
#include <iostream>
#include <windows.h>
using namespace std;
int *p=NULL;
void fun()
{
int i=10;
p=&i;
}
int main()
{
fun();
cout<<"*p= "<<*p<<endl;//输出p=10
Sleep(1000);
cout<<"*p= "<<*p<<endl;//输出p=0
return 0;
}两次输出的值不一样,因为程序发生了悬垂指针的错误。具体和操作系统的堆栈管理方式有关,感兴趣可以去百度~class intptr
{
private:
int* m_p;
public:
intptr(int* p){ m_p = p; }
~intptr(){ delete m_p; }
int& operator*(){ return *m_p; }
};这就是上面想法的一个例子,当我们这样调用的时候不会出现问题:somefunction()
{
intptr pi(new int);
*pi = 10;
int a = *pi;
}但是如果换种方式:void somefunction()
{
intptr pt1(new int);
intptr pt2(new int);
*pt1 = 10;
pt2 = pt1;
}问题就出现了,pt2指向了pt1所指向的内容,那么pt2原来所指向的内容我们就无法获取和销毁了,这也是一种内存泄露。另外在程序块结束后,这块内存将要被销毁两次,这明显是不符合逻辑的。版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/qq369846642/article/details/47005511