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);
两种写法是不是都可以啊?
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的责任。
str=(char*)mallo(n)
char *p =new char[..]
viod *a ;\n(char *)a += 12 和 a = (char *)a+12 有什么区别?
char str=23;
char *p= new char 与char *p = new char[1]有区别吗
char *fgets( char *string, int n, FILE *stream )的返回值是首地址还是?
请编写函数void fun(char a[M][N],char *b)
char CH=char(20);这是什么意思啊?
char *pch=NULL;pch = new char[100]; 和char *pch= new char[100];有什么区别
char pch[100];与char *pch= new char[100];哪个好点