关于显式调用析构函数。

zhengart 2010-04-14 10:17:18
在c++ primer一书中p->~T()的解释是适当地清除p所指向的对象本身,但并没有释放对象所占内存。
但我在写简单的ertor类的时候,在pop_back中使用来释放对象没有效果。

template<class T>
class Vector
{
T *m_pArray;
unsigned int m_nCapacity;
unsigned int m_nSize;
void pop_back()
{
m_nSize--;
(m_pArray + m_nSize)->~T();
}
}
例:主函数中的一段简单代码
Vertor<int> vecA;
push_back(1);
push_back(2);
push_back(3);
pop_back();
for(int n = 0; n != vecA.size() + 1; n++) //这里我特意size + 1来输出多一个。
{
cout << vecA[n] << '\t';
}
输出的是1 2 3
??为什么这里的3还会输出,3不是被析构掉了,应该输出一个不确定的数吗??怎么还会输出一个3来
请高手解释一下,
...全文
197 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
we_sky2008 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhengart 的回复:]
再问个问题。这里我想移除某个元素,然后后面的前部前移一位,应该怎么样弄?
void Vector<T>::erase( T *p )
{
p->~T();
T *cp = p;
while(cp != end() - 1)
{
*cp = *(++cp); //这里测试了没赋值。后面的前部析构掉了。。应该怎么样改?
cp->~T();
}
m_nSize--;
}
[/Quote]
可以用非常规的方法
修改移出对象后面元素的数据成员,然后还是析构栈顶元素
zhengart 2010-04-14
  • 打赏
  • 举报
回复
再问个问题。这里我想移除某个元素,然后后面的前部前移一位,应该怎么样弄?
void Vector<T>::erase( T *p )
{
p->~T();
T *cp = p;
while(cp != end() - 1)
{
*cp = *(++cp); //这里测试了没赋值。后面的前部析构掉了。。应该怎么样改?
cp->~T();
}
m_nSize--;
}
we_sky2008 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhengart 的回复:]
引用 5 楼 we_sky2008 的回复:
原来昨天你说的是这个问题
对于int类型,本身就没有析构函数
你可以自己做一个需要析构函数的类(如string类)试下

不好意思啊,昨天没有把我的真正意思表达出来。
[/Quote]
你用7楼的方法再测试下,输出应该会有问题的
zhengart 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 we_sky2008 的回复:]
原来昨天你说的是这个问题
对于int类型,本身就没有析构函数
你可以自己做一个需要析构函数的类(如string类)试下
[/Quote]
不好意思啊,昨天没有把我的真正意思表达出来。
we_sky2008 2010-04-14
  • 打赏
  • 举报
回复
试试下面这个:

class mystring
{
public:
mystring(char *str = "mystring")
{
this->str = new char[strlen(str) + 1];
strcpy(this->str, str);
}
mystring(const mystring& other)
{
this->str = new char[strlen(other.str) + 1];
strcpy(str, other.str);
}
virtual ~mystring()
{
delete[] str;
}
friend ostream& operator<<(ostream& o, const mystring& ref)
{
o<<ref.str;
return o;
}
private:
char *str;
};


Vertor<mystring> vec_sting;

push_back(mystring("first"));
push_back(mystring("second"));
push_back(mystring("third"));
pop_back();
for(int n = 0; n != vec_sting.size() + 1; n++) //这里我特意size + 1来输出多一个。
{
cout << vec_sting[n] << '\t';
}
selooloo 2010-04-14
  • 打赏
  • 举报
回复
不知道你的~T()是什么样,存在释放对象所占内存但仍能访问对象的情况,当然这是种非法访问,有时会导致程序崩溃
we_sky2008 2010-04-14
  • 打赏
  • 举报
回复
原来昨天你说的是这个问题
对于int类型,本身就没有析构函数
你可以自己做一个需要析构函数的类(如string类)试下
pengzhixi 2010-04-14
  • 打赏
  • 举报
回复
其实对内置类型,析构函数对它什么都不做。
findcsdn 2010-04-14
  • 打赏
  • 举报
回复
3本质上就是不确定的数
ypb362148418 2010-04-14
  • 打赏
  • 举报
回复
你在析构函数里写一句输出的话,然后就会看到了

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧