1.内存分区
一般分为五个区
五个区 | 存放 |
---|
栈 | 保存定义在函数内的非static对象,const 修饰的局部变量[声明周期结束由编译器自动销毁] | 堆 | 存储动态分配对象(new,malloc )[需要手动释放] | 全局/静态存储区 | 保存局部static对象,类static对象以及定义在任何函数之外的对象(全局) [程序结束编译器自动销毁] | 常量存储区 | 存放常量字符串,const 修饰的全局变量. | 代码区 | 存放函数体(类的成员函数、全局函数)的二进制代码; |
int a = 0;
const int b = 0;
const char* c = "hello";
const char* d = "hello";
static int e = 0;
const static int f = 0;
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << static_cast<const void *>(c)<< endl;
cout << static_cast<const void *>(d)<< endl;
cout << &e << endl;
cout << &f << endl;
注意:
- 指针本身存在调用栈中,指针指的数据在堆中。
- 指向同一个常量字符串的指针地址相同
2.智能指针
1. shared_ptr
允许多个指针指向同一个对象,内部有一个引用计数.当引用指针为0时,会调用对象的析构函数释放空间
- 递增
- 当作为一个shared_ptr初始化另外一个shared_ptr
- 作为参数传递给一个函数以及作为函数的返回值
- 递减
- 给一个shared_ptr附上一个新值
- shared_ptr被销毁
- 局部的shared_ptr离开作用域
shared_ptr<int> sptr/shared_ptr<int> sptr(nullptr);;
*sptr = 1;
cout << *sptr;
int a = 0;
shared_ptr<int> sptr(new int(a));
*sptr = 1;
cout << *sptr;
shared_ptr<string> sptr;
if (sptr && sptr->empty())
*sptr = "hello";
智能指针 = 另一个智能指针
2.函数
shared_ptr<int> sptr = make_shared<int>(42);
cout << *sptr << endl;
auto sptr = make_shared<int>(42);
cout << *sptr << endl;
shared_ptr<T> p(q)
shared_ptr<T> p(u)
shared_ptr<T> p(q,d)
shared_ptr<T> p(p2,d)
p.get();
p.reset();
p.reset(q);
p.reset(q,d);
3.生存周期
- 可以把他当初一个局部变量
- 只有一种情况会不会释放,就是把指针放在容器中,但是结束的时候没有把他删除掉;用完记得erase()
2. unique_ptr
只允许当前指针独占对象,当unique_ptr被销毁,那么指向的对象也会被销毁
- 没有make_shared函数类型的函数,只能通过new来完成绑定
- 不支持普通的拷贝或者赋值
unique_ptr<int> p2(new int(42));
unique_ptr<T> u1
unique_ptr<T,D> u2
unique_ptr<T.D> u(d)
u = nullptr;
u.release();
p.reset();
p.reset(nullptr);
p.reset(q);
传递和返回unique_ptr
unique_ptr<int> clone(int p)
{
return unique_ptr<int>(new int(p));
}
unique_ptr<int> clone(int p)
{
unique_ptr<int> ret(new int(p))
return ret;
}
3. weak_ptr
是一种软引用,可以指向shared_ptr 的对象
3. new 关键字
string *ps1 = new string;
string *ps2 = new string();
int *pi1 = new int;
int *pi2 = new int();
int *p2 = new (nothrow)int;
4. delete 关键字
int i = 0;
int *pi1 = &i;
int *pi2 = nullptr;
double *pd = new double(33);
double *pd2 = pd;
delete pi1;
delete pi2;
delete pd;
delete pd2;
空悬指针
double *pd = new double(33);
delete pd;
pd = nullptr;
double *pd = new double(33);
auto pd2 = pd;
delete pd;
pd = nullptr;
delete pd2;
5. new 和 智能指针搭配
shared_ptr<int> p1 = new int(1024);
shared_ptr<int> p2(new int(42));
不要混合使用内置和智能
void process(shared_ptr<int> ptr){...}
int *x(new int(1024));
process(x);
process(shared_ptr<int>(x));
*x;
|