试问下列同时运行多个进程Pi,可能会出现的错误是( )。 Pi(){ Lock(m mutex); //含义为获取互斥信号量 a=new int[100]; //开辟一个大小为100的整型数组空间, //并用全局指

admin2019-07-18  63

问题 试问下列同时运行多个进程Pi,可能会出现的错误是(    )。
Pi(){
    Lock(m mutex);    //含义为获取互斥信号量
    a=new int[100];    //开辟一个大小为100的整型数组空间,
    //并用全局指针变量a保存空间地址
    UnLock(m_mutex);
    free(a);    //释放数组空间,且a的值不改变
    }
    有多个优先级相同的进程Pi。

选项 A、内存泄露
B、内存越界访问
C、内存泄露和内存越界访问
D、无

答案C

解析 由于a为全局指针变量,即属于临界资源,访问a的代码都属于临界区,临界区应该在Lock(m mutex)和UnLock(m mutex)之间,使各个进程互斥访问a。但由于本题free(a)在Lock(m mutex)和UnLock(m mutex)之外,因此是会出现错误的。
    举例:假设有进程P1和P2,P1进程申请的数组空间地址赋给a之后,还没有free掉。P2进程又申请了新的数组空间又把地址赋给a,导致P1进程申请的空间地址丢失(即内存泄露)。然后P1进程继续执行,P1进程执行free操作,将P2进程中请的空间释放掉了,P2进程继续执行,P2进程执行free操作,free操作访问了不属于P2进程的空间(之前已经被P1释放掉了),会发生内存越界访问。  
知识点扩展  内存泄露:当以前分配的一片内存不再需要使用或无法访问时,但是并没有释放它,那么对于该进程来说,会因此导致总可用内存的减少,这时就出现了内存泄漏。
    内存越界访问:简单地说,进程访问了不属于该进程的内存空间。
转载请注明原文地址:https://jikaoti.com/ti/9BGjFFFM
0

随机试题
最新回复(0)