char* pBuffer=new char[0x8000]和 charp Buffer[0x8000]有什么区别

来源:百度知道 编辑:UC知道 时间:2024/06/04 06:59:52
一种写法:
char* pBuffer=new char[0x8000];
CFile file("mydoc.doc",CFile::modeRead);
UINT nBytesRead=file.Read(pBuffer,0x8000);
另一种写法:
char pBuffer[0x8000];
CFile file("mydoc.doc",CFile::modeRead);
UINT nBytesRead=file.Read(pBuffer,0x8000);
两种写法是不是都可以啊?

区别在于变量的内存位置不同,以及释放内存方式不同。看下面的注释

比如在某函数中:
void func(void)
{
char* pBuffer_heap=new char[0x8000]; // 动态分配内存,pBuffer_heap指向的内存块位于进程
// 的堆地址空间heap),而非函数堆栈,当然pBuff_heap这个指针变量还是在函数堆栈上的
char pBuffer_stack[0x8000]; // 位于函数func的堆栈里面(stack)
delete pBuffer_heap; // 必须手动释放内存,否则导致堆上的那块内存泄漏
}
注意:
(1)局部变量字符串指针pBuffer_heap和字符数组pBuffer_stack由于在函数堆栈上,所以在函数结束后,函数所用的堆栈会被系统回收,不需要你去释放pBuff_stack所占用的内存,当然字符串指针pBuffer_heap所占用的四个字节也会被系统自动回收。
(2)局部变量字符串指针pBuffer_heap所指向的内存块则位于进程的堆地址空间,如果你不在函数结束前用delete pBuffer_heap把这块内存释放掉,则会导致这块内存泄漏。

若是UDT类型指针,则new调用其构造函数,而delete 会调用UDT的析构函数进行内存释放,同样指针所指内存块位于进程的堆空间;
若是UDT类型局部对象,则由于对象在函数堆栈上,在函数结束,对象生命终结的时候,系统负责自动调用对象的析构函数进行内存释放;

当然,如果你的UDT类型的析构函数没有正确实现,则会导致内存问题。但这已经超出了你的问题范围了,也不是new和delete的责任。