标签:情况下 调用 return EAP 多个 send 应用 highlight 不同的
1、Postmessage 与 SendMessage的区别
PostMessage该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMessage取得
SendMessage该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回,SendMessage函数返回值为消息处理结果。。
2、在一个动态链接库中new的内存能在另一个动态链接库中释放吗?
当一个应用程序初始化的时候,首先被初始化的是C Run-Time Library,然后才是应用程序的入口函数,而Heap对象就是在C Run-Time Library被初始化的时候被创建的。
对于动态链接的C Run-Time Library,运行库只被初始化一次,而对于静态连接的运行库,每链接一次就初始化一次,所以对于每个静态链接的运行库都拥有彼此不同的Heap 对象。这样在某种情况下就会出问题,导致程序崩溃,例如一个应用程序调用了多个DLL,除了一个DLL外,其他的DLL,包括应用程序本身动态连接运行 库,这样他们就使用同一个Heap对象。而有一个DLL使用静态连接的运行库,它就拥有一个和其他DLL不同的Heap 对象,当在其他DLL中分配的内存在这个DLL中释放时,问题就出现了。
3、几个内存问题
题一·:
void GetMemory( char *p ) { p = (char *) malloc( 100 ); } void Test( void ) { char *str = NULL; GetMemory( str ); strcpy( str, "hello world" ); printf( str ); }
该题传入的形参是实参本身,而不是取地址,传入的形参在函数内部改变时并不能真正改变传入形参的值,执行完GetMemory(str)函数后,str依然为NULL.
题二
char *GetMemory( void ) { char p[] = "hello world"; return p; } void Test( void ) { char *str = NULL; str = GetMemory(); printf( str ); }
运行完str=GetMemory()时,str的值还是正确的,但是执行printf(str)时,printf内部的三个变量覆盖了str原有的直,网上解释为,p为局部变量,调用完GetMemery()后,P指向的内存释放,即str指向内存释放,所以打印的为不确定乱码
题三
void GetMemory( char **p, int num ) { *p = (char *) malloc( num ); } void Test( void ) { char *str = NULL; GetMemory( &str, 100 ); strcpy( str, "hello" ); printf( str ); }
能够成功,但最好加上判断是否申请内存成功。
题四
void Test( void )
{
char *str = (char *) malloc( 100 ); strcpy( str, "hello" ); free( str );
if(NULL != str)
{
strcpy(str, "123456");
printf(str);
}
}
free()后应将str置为NULL,,不置为空,if内部操作的为野指针,会出现崩溃问题。。
标签:情况下 调用 return EAP 多个 send 应用 highlight 不同的
原文地址:https://www.cnblogs.com/fenglangxiaotian/p/9445283.html