windows 应用层编程基础试题

Q:频繁new和delete 会有什么影响?

 A:增加程序CPU开销,造成大量内存碎片,最终可能造成,内存不足,申请不到想要的空间大小。解决办法,使用内存池。

 

以下两种获取字符串方式,正不正确? 

//返回char*指针没有问题
char *GetString()
{
    char *p = new char[1024];
    ...
    return p;
}


//返回局部变量地址,出现意外错误
char *GetString()
{
    char szBuff[] = "hello world";
    char *p = szBuff;

    return p;
}

下面结构体大小是多少?

//该结构体大小为8字节。  因为有virtual 虚函数,结构体会多一个虚表指针,大小为4字节。加上成员变量int32_t 4字节,总共8字节。
class Test
{
public:
	Test():m_nNum(999) {};
	~Test() {};
	virtual void print6()
	{
		printf("6\r\n");
	}
	virtual int retint()
	{
		return 8;
	}
private:
	int32_t m_nNum;
}GTest;  



//该结构体大小为4字节,因为没有虚表指针,所以只计算成员变量大小(int32_t) 4字节。
class Test2
{
public:
	Test2():m_nNum(999) {};
	~Test2() {};
	void print6()
	{
		printf("6\r\n");
	}
	int retint()
	{
		return 8;
	}
private:
	int32_t m_nNum;
}GTest2;  

删除std::vector<int32_t>其中为1的元素. 需要注意 earse(ite) 后,返回值是下一个元素ite。

    //这么写会异常,因为erase后,该ite已经失效,再对期执行ite++操作,会抛异常。 erase的返回值是指向下一个元素的ite.
	std::vector<int32_t> test = {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0};
	for (std::vector<int32_t>::iterator ite = test.begin(); ite != test.end(); ite++)
	{
		int32_t i = *ite;
		if (i == 1)
		{
			test.erase(ite);
		}
	}
	




    //正确删除方法
    std::vector<int32_t> test = {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0};
	for (std::vector<int32_t>::iterator ite = test.begin(); ite != test.end();)
	{
		int32_t i = *ite;
		if (i == 1)
		{
			ite = test.erase(ite);//删除后该ite失效,erase返回下一个元素的iterator,更新ite的值,否则再对已经失效的ite进行操作,会异常 
		}
		else
		{
			ite++;
		}
	}

多线程同步:

  互斥体和事件对象

//创建自动处理信号的事件对象,间第二个Wait会不会走下去?
HANDLE h1 = CreateEvent(NULL, FALSE, FALSE, NULL);
WaitForSingleObject(h1, INFINITE);
WaitForSingleObject(h1, INFINITE); //该wait不会走下去。因为第一个wait完成后,h1自动被设为无信号,如果想要使其有信号,必须调用SetEvent(h1);



//互斥体做线程同步,请问第二个wait会不会走下去?
HANDLE h2 = CreateMutex(NULL, FALSE, NULL);
WaitForSingleObject(h2, INFINITE);
WaitForSingleObject(h2, INFINITE); //第二个wait会走下去,因为创建开始当前线程拥有h2的执行权,当前线程没有调用 ReleaseMutex(h2)释放其拥有权,其他线程就不会拿到h2的拥有权。而且Mutex没有自动释放拥有权的机制。必须调用ReleaseMutex(HANDLE),或者拥有h2所有权的线程执行完 才会释放.


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值