gpt4 book ai didi

c++ - 全局数组变量在线程中丢失值

转载 作者:行者123 更新时间:2023-11-30 03:56:18 24 4
gpt4 key购买 nike

我正在开发一个小应用程序,它首先将一些值添加到定义为全局变量的指针数组中:

#define MAX_LOCATIONS 32

LocationDTO* locations[MAX_LOCATIONS];
int nLocations = 0;

我使用以下方法将 LocationDTO 对象引用添加到数组:

bool addLocation(Location *location, string name){
LocationDTO l(name, location);
if(nLocations < MAX_LOCATIONS){
locations[nLocations] = &l;
nLocations++;
return true;
}else{
return false;
}
}

我通过这种方式从 main 方法调用这个函数:

Location l1(1,2);
addLocation(&l1, "one");

Location l2(2,3);
addLocation(&l2, "two");

Location l3(4,5);
addLocation(&l3, "three");

添加所有值后,我启动一个线程来处理这个数组。线程定义:

void* server_thread(void* args){
// Some code

int i;
for(i=0; i < nLocations; i++){
LocationDTO* l = locations[i];

// More Code
}
}

问题是,此时在线程中,locations 中包含的对象不再具有我分配给它们的值。

出现此问题是否是因为我在 addLocation 中创建对象,然后将引用保存在数组中?

最佳答案

是的,你是对的。当您离开 addLocation 方法时,LocationDTO l 变量将被销毁。

我看到这个问题的可能解决方案很少:第一种解决方案:

std::vector<LocationDTO> locations;
const size_t maxSize = 32;
bool addLocation(Location *location, string name)
{
if( locations.size() < maxSize )
{
locations.emplace_back( name, location );
return true;
}
return false;
}

第二种解决方案:

bool addLocation(Location *location, string name){
LocationDTO* l = new LocationDTO(name, location);
if(nLocations < MAX_LOCATIONS){
locations[nLocations] = l;
nLocations++;
return true;
}else{
return false;
}
}

如果您决定使用第二种解决方案,请不要忘记删除所有已分配的 LocationDTO 对象

关于c++ - 全局数组变量在线程中丢失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28610282/

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