我有这段代码:
typedef struct {
string fName;
string str;
}t;
//-------Other functions------//
void BeginTh()
{
string arg = "yes";
t *arglist;
arglist = (t*)malloc(sizeof(t));
arglist->fName = "comBomber";
arglist->str = arg;
_beginthread(startOver, 0, (void*)arglist);
free(arglist);
}
在'arglist-> fName =“comBomber”;'我收到这个错误:
An unhandled exception of type 'System.AccessViolationException' occurred in <appname>
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
任何人都可以帮助我吗?怎么解决这个问题?
感谢。
答案 0 :(得分:6)
我建议现代C ++风格:
#include <future>
#include <string>
struct arg_t {
std::string fName;
std::string str;
};
int startOver(int i, arg_t args)
{
return args.fName.size() + args.str.size() + 42;
}
int main()
{
const std::string arg = "yes";
arg_t args = { "comBomber", arg };
auto worker = std::async(startOver, 0, args);
return worker.get();
}
在http://ideone.com/zrXcwH上查看(由于ideone不支持pthread
库,因此无法运行)。我用MS Visual C ++测试了它。
如果复制arg_t
非常昂贵,您只需将其移至另一个帖子即可:
auto worker = std::async(startOver, 0, std::move(args));
答案 1 :(得分:5)
一个问题是您的t
实例未正确初始化。您可以使用new
而不是malloc
来解决此问题。您的struct包含string
,需要调用其构造函数。调用new
可确保正确构造t
对象。
t* arglist = new t;
然后通过调用delete
来释放内存:
delete arglist;
这指出了第二个问题,即在整个线程执行期间必须保证您的t
实例处于活动状态。在线程完成之前,不应该取消分配内存。这是一个C ++示例,其中t
对象保证比线程更长:
#include <thread>
int main()
{
t arglist = whatever;
std::thread t(startover, &whatever); // launches thread which runs startover(&arglist)
// do other stuff
t.join(); // wait for thread execution to finish
}
通常,您应该使用smart pointer而不是使用原始指针来动态分配对象。
另外,在C ++中声明typedef
的{{1}}语法看起来很奇怪。通常,你会这样做:
struct
答案 2 :(得分:3)
malloc
只会为对象分配内存,但不会调用其构造函数
您需要更改为新
t *arglist = new t;
此外,在startOver线程获取其内容之前,不要释放arglist内存块。你可以在线程内或其他地方发布它。
void startOver(void* param)
{
Param* param_ = (Param*)param; // get hold of param pointer
while(true){
// do something
}
delete param_; // release param when thread finishes
}
void BeginTh()
{
Param *param = new Param();
param->fName = "abcd";
param->str = "yes";
_beginthread(startOver, 0, (void*)param);
}