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*
------解决方案--------------------
编译通过就说明是可以的啊
对象正常是否就没问题了
------解决方案--------------------
指针指向常量对象,说明该对象在其生存期间逻辑上不允许改变。delete不是改变其内容,而是对象生存期结束。
------解决方案--------------------
delete没有操作常量,只是把内存返回给内存块链表,等内存管理机构而已,delete 没有动他呀!
虽然调用了析构函数,常量是可以析构的,常量对象,只有构造函数和析构函数可以改变;
而整型常量,也不是类对象,是内部类型,也基本不需要构造和析构。
已经delete的内存还是可以使用的,只是如果重新分配给别的地方使用了;
这种内存的使用就会出错了,有可能在新的分配过程中,那块内存用于管理数据块了,
这就是非常严重的错误了,内存管理没法继续了,程序崩溃;
如果还是分给用户变量了,那么数据就会么明其妙的被改写,或者读出一个莫名其妙的数据;
这样程序就不可控制了,崩溃的倾向就出现了。
而你的这种情况,只是为const int型数据分配内存而已;
由于每个数据都是const int,对不起,你的数据不能被你的代码改变,只能在
Test的构造函数里初始化,在Test对象析构时析构。
如果你的Test类似Vector ;