专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++

指向const对象指针的疑义

发布时间:2011-06-28 15:08:07 文章来源:www.iduyao.cn 采编人员:星星草
指向const对象指针的疑问
template<typename T>
class Test
{
public:
Test()
{
_p = new T;
}

~Test()
{
delete _p;
_p = NULL;
}

private:
T* _p;
};



声明一个Test对象 Test<const int> t1;

那么现在_p指向const int,析构的时候 删除一个指向const对象的指针?
这个允许吗?我在vs2008下是可以的。

------解决方案--------------------
const int* p是指向的内容是常量
------解决方案--------------------
1楼正解。模板传入的类型是const int,_p的类型是 const int*
------解决方案--------------------
引用:
template<typename T>
class Test
{
public:
Test()
{
_p = new T;
}

~Test()
{
delete _p;
_p = NULL;
}

private:
T* _p;
};



声明一个Test对象 Test<const int> t1;

那么现在_p指向const int,析构的时候 删除一个指向const对象的指针?
这个允许吗?我在vs2008下是可以的。


编译通过就说明是可以的啊
对象正常是否就没问题了

------解决方案--------------------
引用:
Quote: 引用:

1楼正解。模板传入的类型是const int,_p的类型是 const int*


指向的内容是常量,那么说明这个内容是不能改变的?
但是析构函数,delete _p,把_p指向的内存delete了,那么_p指向的内容不是改变了吗?
这不矛盾??


指针指向常量对象,说明该对象在其生存期间逻辑上不允许改变。delete不是改变其内容,而是对象生存期结束。
------解决方案--------------------
delete没有操作常量,只是把内存返回给内存块链表,等内存管理机构而已,delete 没有动他呀!
虽然调用了析构函数,常量是可以析构的,常量对象,只有构造函数和析构函数可以改变;

而整型常量,也不是类对象,是内部类型,也基本不需要构造和析构。
已经delete的内存还是可以使用的,只是如果重新分配给别的地方使用了;

这种内存的使用就会出错了,有可能在新的分配过程中,那块内存用于管理数据块了,
这就是非常严重的错误了,内存管理没法继续了,程序崩溃;

如果还是分给用户变量了,那么数据就会么明其妙的被改写,或者读出一个莫名其妙的数据;
这样程序就不可控制了,崩溃的倾向就出现了。

而你的这种情况,只是为const int型数据分配内存而已;
由于每个数据都是const int,对不起,你的数据不能被你的代码改变,只能在

Test的构造函数里初始化,在Test对象析构时析构。

如果你的Test类似Vector ;
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: