malloc 后 free 函数出错
Error with free function after malloc
以下代码导致C++在线崩溃:free(arg)。我试图防止发生内存泄漏,但我无法设法释放存储在堆内存中的数据。有人可以帮我解决这个问题吗?
请注意 free(args) 工作正常。
#include "stdafx.h"
#include <process.h>
#include <iostream>
#include <windows.h>
using namespace std;
typedef struct {
int StartNode;
int EndNode;
}t;
t *arg;
void myFunc(void *param) {
t *args = (t*)param;
int x = args->StartNode;
int y = args->EndNode;
printf("x=%d, y=%d\n", x, y);
free(args);
free(arg);
}
int main()
{
HANDLE handle;
arg = (t *)malloc(sizeof(t));
arg->StartNode = 101;
arg->EndNode = 103;
handle = (HANDLE)_beginthread(myFunc, 0, (void*)arg);
cin.get();
return 0;
}
您的两个指针分别 args
和 arg
都指向相同的内存位置,并且您试图释放相同的内存位置两次,这会在此处造成问题。请看下面:-
free(args); //args->arg here args is pointing to arg you have just type cast it from void
free(arg);//you have already release the memory in the above call so this is wrong
像这样尝试理解,下面的例子不是解决方案,而是为了你的理解。在这里你分配 args = NULL
并且这将反映在 arg = NULL
中因此 if(arg != NULL)
将是错误的并且因此 free(arg);
将不会被调用。:-
free(args);
args = NULL;
if(arg != NULL)
free(arg);
自由调用次数需要和malloc一致。
你只 malloc conde 一次,在
arg = (t *)malloc(sizeof(t));
但是你释放了同一个地址两次:
free(args);
free(arg);
现在,这是 C 代码,而不是 C++(因为 C++ 你会使用 new/delete,或者更好的是,你会 不 使用 nor new 或 delete,并传递通过堆栈中的引用变量,如下所示:
#include <iostream>
#include <windows.h>
struct MyType {
int StartNode;
int EndNode;
};
void myFunc(const MyType ¶m) {
const auto x = args.StartNode;
const auto y = args.EndNode;
std::cout << "x=" << x << ", y=" << std::endl;
}
int main()
{
auto arg = MyType{};
arg.StartNode = 101;
arg.EndNode = 103;
std::thread thread(myFunc, arg);
thread.join();
cin.get();
return 0;
}
一些随机笔记:
- 您正在混合使用 C 和 C++,它们不是相同的语言
- 您正在使用 windows-only 调用,请使用 std(就像在线程示例中一样)
- 不要使用 using namespace std;这会使代码立即变得不可读。
args 和 arg 都指向相同的内存位置。随便打个电话就够了。
以下代码导致C++在线崩溃:free(arg)。我试图防止发生内存泄漏,但我无法设法释放存储在堆内存中的数据。有人可以帮我解决这个问题吗?
请注意 free(args) 工作正常。
#include "stdafx.h"
#include <process.h>
#include <iostream>
#include <windows.h>
using namespace std;
typedef struct {
int StartNode;
int EndNode;
}t;
t *arg;
void myFunc(void *param) {
t *args = (t*)param;
int x = args->StartNode;
int y = args->EndNode;
printf("x=%d, y=%d\n", x, y);
free(args);
free(arg);
}
int main()
{
HANDLE handle;
arg = (t *)malloc(sizeof(t));
arg->StartNode = 101;
arg->EndNode = 103;
handle = (HANDLE)_beginthread(myFunc, 0, (void*)arg);
cin.get();
return 0;
}
您的两个指针分别 args
和 arg
都指向相同的内存位置,并且您试图释放相同的内存位置两次,这会在此处造成问题。请看下面:-
free(args); //args->arg here args is pointing to arg you have just type cast it from void
free(arg);//you have already release the memory in the above call so this is wrong
像这样尝试理解,下面的例子不是解决方案,而是为了你的理解。在这里你分配 args = NULL
并且这将反映在 arg = NULL
中因此 if(arg != NULL)
将是错误的并且因此 free(arg);
将不会被调用。:-
free(args);
args = NULL;
if(arg != NULL)
free(arg);
自由调用次数需要和malloc一致。 你只 malloc conde 一次,在
arg = (t *)malloc(sizeof(t));
但是你释放了同一个地址两次:
free(args);
free(arg);
现在,这是 C 代码,而不是 C++(因为 C++ 你会使用 new/delete,或者更好的是,你会 不 使用 nor new 或 delete,并传递通过堆栈中的引用变量,如下所示:
#include <iostream>
#include <windows.h>
struct MyType {
int StartNode;
int EndNode;
};
void myFunc(const MyType ¶m) {
const auto x = args.StartNode;
const auto y = args.EndNode;
std::cout << "x=" << x << ", y=" << std::endl;
}
int main()
{
auto arg = MyType{};
arg.StartNode = 101;
arg.EndNode = 103;
std::thread thread(myFunc, arg);
thread.join();
cin.get();
return 0;
}
一些随机笔记:
- 您正在混合使用 C 和 C++,它们不是相同的语言
- 您正在使用 windows-only 调用,请使用 std(就像在线程示例中一样)
- 不要使用 using namespace std;这会使代码立即变得不可读。
args 和 arg 都指向相同的内存位置。随便打个电话就够了。