传统指针
【摘要】 传统指针
1.传统指针
值初始化的写法
string * mystr = new string(); //加不加括号效果是一样的,都是空
int * myint = new int(); //值被初始化为0,这个括号加和不加确实不一样,只有加了括号值才为0
像string * mystr = new string,这种new一个类,其实就是调用了构造函数
但是如果是自己写的类
class A
{
public:
A()
{
cout << "A" << endl;
}
int m_i;
};
在main中
A * p1 = new A;
A * p1 = new A();
上面两种效果是一样的,都是调用构造函数,也就是说,自己定义的类,在new这个对象的时候,所谓的值初始化是没有意义的,有意义的只有这种内置类型,像上面的int类型
所以对于动态分配的对象,能初始化就初始化一下为好,防止值没初始化,而一旦用了没初始化的值,可能会造成程序错误
C++11中,auto可以和new一起用
string * mystr = new string(5, 'a');
auto mystr1 = new auto(mystr);
这个时候mystr1会被推断为string **类型,也就是指针的指针类型,所以上面auto这行代码类似于
string ** mystr1 = new (string *)(mystr);
最后不要忘记释放内存
delete mystr;
delete mystr1;
const对象也可以动态分配内存
const int * point = new const int(200); //new后面的const写不写无所谓,当然const对象不能修改其值
*point = 300; //这是错误的
delete point // 这是正确的,虽然const对象值不能被改变,但是可以被delete
不是new出来的不能delete,否则编译不报错,但是执行时会出现异常
int i;
int * p = &i;
delete p; //这是错的
建议delete一个指针后,将指针设为空,比如上面的point = nullptr; 因为一个指针即使被delete,只是把它指向那部分内存的地址给释放了,但该指针中依然保存着它所指向的那块动态内存的地址,此时的指针叫做悬空指针(程序员不能再操作这个指针所指向的内存),给它加一个nullptr,表示这指针不指向任何内存,是一个好习惯
内存被释放后千万不能读或者写,并且内存不能被释放两次,比如两个指针指的一个内存,一个指针delete了,则这个内存就被回收了,另一个指针就不能操作这个内存了,也不能再delete
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)