【发布时间】:2011-03-28 11:50:17
【问题描述】:
给定代码:
#include<iostream>
using namespace std;
class String
{
char *pstr;
unsigned size;
public:
String(){ pstr=0;size=0;}
String(const char *);
void show(){ cout << pstr << endl ; }
~String () { cout << "In Dtor" << endl; delete [] pstr; }
};
String::String(const char * cptr)
{
size = strlen (cptr) + 1;
cout << "String is - " << cptr << " - of size " << size - 1 << endl ;
pstr = new char [ size ] ;
for ( int i = 0 ; i < size ; i++)
pstr[ i ] = cptr [ i ];
}
int main()
{
String s("Hello World");
s.show();
s.~String();
}
输出:
String is - Hello World - of size 11
Hello World
In Dtor
----Debug Assertion Failure----
In Dtor
为什么要再次调用析构函数?我什么时候调用了析构函数?
什么是断言失败?
此代码也有效吗?
char * ptr=0;
void fun()
{
const char * p = "Hello World";
int size = strlen(p )+ 1;
cout << size << endl;
ptr = (char *)malloc(size);
for ( int i = 0 ; i < size ; i++)
ptr[ i ] = p [ i ];
cout << p << endl << ptr << endl ;
}
int main()
{
fun();
free (ptr); --> Note
}
可以从另一个函数中释放指针吗?这是我想在这里理解的主要内容。
【问题讨论】:
-
不需要显式调用析构函数,您没有使用免费存储。
-
@DumbCoder:即使使用堆,您也不会显式调用析构函数。你只打电话给
delete。 -
@Acme:在您的编辑中:是的,您可以,但这并不真正属于同一个问题。另外,我确定之前已经回答过:先搜索再询问!
-
@Xeo::如果一切都可以搜索,就不需要 StackOverflow。您认为 SO 是您获得答案的唯一地方吗?
-
@Acme:搜索 SO 本身当然是一种选择……但除此之外。它并不真正属于这个问题。如果尚未提出(或者您找不到类似问题),则将其作为一个新问题提出,以便可以搜索它。 ;)
标签: c++ visual-c++ function string destructor