gpt4 book ai didi

c++ - Pthread 和 void* 尝试取消引用通用指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:16 24 4
gpt4 key购买 nike

当我调试我的 PRJ 时,我得到这个错误:

args Error: Multiple errors reported.\ Failed to execute MI command: -var-create -

args Error message from debugger back end: Attempt to dereference a generic pointer.\ Unable to create variable object

从 void* args 转换为 Mapper* arg 时出现错误。

更新 1

KMaster, KMapper 分别实现了Master, Mapper 但没有添加任何相关的东西。实际上是调用方法 work() 的 KMapper。这是代码:

int main(){
int np=1,K=4;
string path="lucca.gps";
KMaster* master=new KMaster(path,np,K);
KMapper* mapper[np];
master->splitting();
for(int i=0;i<np;i++){
mapper[i]=new KMapper(master,master->mData[i].key,master->mData[i].value);
while(mapper[i]->work()!=0){
cout<<"failed creating mapper, retry..."<<endl;
sleep(1000);
}
}
}

int KMaster::splitting(){
cout<<"start splitting"<<endl;
fstream is(path.c_str());
string s="";
getline(is,s);
while(!is.eof()){
for(int i=0;i<nProc;i++){
pair<double,double> res;
is>>res.first;
is>>res.second;
is>>s;
mapData[i].push_back(res);
Data.push_back(res);
if(is.eof()) break;
}
}
list<pair<double,double> >::iterator it=Data.begin();
int increment=Data.size()/K;
for(int i=0;i<K;i++){
Klusters.push_back(*it);
advance(it,increment);
}
for(int i=0;i<nProc;i++){
mData[i].key=&Klusters;
mData[i].value=&mapData[i];
}
cout<<"splitting completed"<<endl;
return 0;
}

int Mapper::work(){
Mapper* m=this;
void* p=m;
return pthread_create(&thread,NULL,start,p);
}

void* start(void* args){
cout<<"start()"<<endl;
Mapper* arg= reinterpret_cast<Mapper*>(args);
arg->mapResult=arg->map(arg->k,arg->v);
cout<<"Mapper finish, sending result..."<<endl;
arg->send(arg->mapResult);
}

希望有人能帮忙!

更新 2

调试器的屏幕截图:

eclipse debug

最佳答案

arg 的值为 24,正常对象都不会存在于此,因此转换与此无关。

不幸的是,这个“答案”只能是一个随意的猜测,因为您还没有显示调用代码。

如果 arg 总是 24,我会检查类似这样的东西:

class Something
{
public:
void dostuff() { mapper.work(); }
private:
// 24 bytes of "stuff" before this member (including possibly a vtable)
Mapper mapper;
};

Something *thing = 0;
thing->dostuff(); // Thing->mapper will have address 24.

也有可能你有一个未初始化的变量

Mapper* mapper;
mapper->work(); // Oops, uninitialised

恰好是 24。

关于c++ - Pthread 和 void* 尝试取消引用通用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14509909/

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