首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

指向const对象指针的疑义

2013-07-21 
指向const对象指针的疑问templatetypename Tclass Test{public:Test(){_p new T}~Test(){delete _p_

指向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 ;



那么,你没有办法初始化你的每个成员;

只能主动或者被动(自动的)调用const int的默认构造函数初始化了事。

由于_p 是一个指针,也可以用memset 这样的函数初始化;
不过这时,已经跳过类型检查了, const int起不到作用了。

这不是C++的问题,也不是编译器的问题,这是你刻意要做,这种自相矛盾的事情;
编译器也是通情达理的,会允许的,只是正确性,只能自己去保证了,编译器没有办法管了。


热点排行
Bad Request.