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
//这么写会异常,因为erase后,该ite已经失效,再对期执行ite++操作,会抛异常。 erase的返回值是指向下一个元素的ite.
std::vector 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::iterator ite = test.begin(); ite != test.end(); ite++)
{
int32_t i = *ite;
if (i == 1)
{
test.erase(ite);
}
}
//正确删除方法
std::vector 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::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所有权的线程执行完 才会释放.