当值到指针时,尝试读取或写入受保护的内存
Attempt to read or write protected memory when value to pointer
我有这个代码:
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.
有人可以帮助我吗?如何解决这个问题?
谢谢。
我建议现代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));
一个问题是您的t
实例未正确初始化。你可以通过使用new
而不是malloc
来解决这个问题 你的结构包含一个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
}
通常,不应使用原始指针来动态分配的对象,而应使用智能指针。
顺便说一句,声明struct
的typedef
语法在C++中看起来很奇怪。通常,您会这样做:
struct t {
string fName;
string str;
};
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);
}
相关文章:
- 公共/私有/受保护是否会更改内存中结构的排列?
- 检查nullptr是否100%保护内存布局不受segfault影响
- 如何编辑受保护的进程内存?
- C 写入具有受保护内存的过程
- 尝试读取或写入受保护的内存.这通常表示其他内存已损坏.在C++Dll中
- 当值到指针时,尝试读取或写入受保护的内存
- C#调用C++dll试图读取或写入受保护的内存
- 在 C# 中加载非托管C++.错误 尝试读取或写入受保护的内存
- 尝试读/写受保护的内存错误,同时固定 c++ 函数
- 试图读取或写入受保护的内存:C++修改的内存值
- 已尝试读取或写入受保护的内存.这通常表示其他内存已损坏 DllImport
- 试图在 c# 访问 c++ dll 时读取或写入受保护的内存错误
- 未处理的异常:系统.访问违规异常:尝试读取或写入受保护的内存
- 通过 DllImport 在 C# 中调用 C 方法 - 尝试读取或写入受保护的内存
- P/在 /MT 或 /MD 上调用"受保护的内存"异常
- System.AccessViolationException试图读取或写入受保护的内存
- C++.NET包装程序:试图读取或写入受保护的内存.这通常表示其他内存已损坏
- 系统.AccessViolationException:试图在c++ dll中读写受保护的内存
- 附加信息:试图读取或写入受保护的内存.这通常表明其他内存已损坏
- dll错误:试图读取或写入受保护的内存