gpt4 book ai didi

c++ - 这些有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 19:59:47 25 4
gpt4 key购买 nike

任何人都可以向我解释以下使用的在 map 容器中插入新对象的方法的区别吗?我已经知道指针等,我并没有真正深入到虚拟内存,只是基础知识(地址等)

#include "StdAfx.h"
#include <windows.h>
#include <cstdlib>
#include <iostream>
#include <map>

using namespace std;

class CUser
{
public:
CUser() { Init(); };
~CUser() {};
public:
BOOL m_bActive;
BOOL m_bLoggedIn;
SYSTEMTIME m_sysTime;

void Init();
};


void CUser::Init()
{
(*this).m_bActive = FALSE;
m_bLoggedIn = FALSE;
GetSystemTime( &m_sysTime );
}

int main(int argc, char *argv[])
{

map<DWORD, CUser*>mUserMap;


//what is the difference between this
{
CUser pUser;
pUser.m_bActive = FALSE;
pUser.m_bLoggedIn = FALSE;
GetSystemTime( &pUser.m_sysTime );
mUserMap.insert( make_pair( 351, &pUser ) );
}
//and this?
{
CUser *pUser = new CUser;
if( pUser )
{
pUser->m_bActive = TRUE;
pUser->m_bLoggedIn = TRUE;
GetSystemTime( &pUser->m_sysTime );
mUserMap.insert( make_pair( 351, pUser ) );
}
}

/* map<DWORD, CUser*>::iterator it = mUserMap.find( 351 );
if( it == mUserMap.end() )
std::cout << "Not found" << std::endl;
else
{
CUser *pUser = it->second;
if( pUser )
std::cout << pUser->m_sysTime.wHour << std::endl;
} */


return 0;
}

最佳答案

在第一种情况下,pUser 是在堆栈上创建的,当它的名称超出范围时(即在下一个右花括号处),将被自动删除。一般来说,将指向堆栈对象的指针插入到容器中是不明智的,因为该对象将不复存在,而容器仍有指向它的值。在最好的情况下,这可能会导致崩溃。在最坏的情况下,它可能会导致代码中较远部分的错误不稳定且难以定位。

关于c++ - 这些有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11003081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com