面试的问题 及回答

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内部操作的为野指针,会出现崩溃问题。。

猜你喜欢

转载自www.cnblogs.com/fenglangxiaotian/p/9445283.html
今日推荐