传统指针

举报
无敌清风蓝 发表于 2023/08/31 22:10:23 2023/08/31
【摘要】 传统指针

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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。