为什么免费崩溃?

jma*_*erx 0 c++

当它获得释放时,以下崩溃:(有使用void*的理由).

bool s = true;

void* arg = &s;
argument = malloc(sizeof(arg));
memcpy(argument,arg,sizeof(arg));
free(argument);
Run Code Online (Sandbox Code Playgroud)

这里的论点是无效*

为什么免费崩溃应用程序?

谢谢

Ben*_*igt 8

你的问题很可能在其他地方.

由于你有一些误解,sizeof (pointer)我怀疑你的程序中的其他地方有一个缓冲区溢出/下溢导致堆头损坏,然后free当它试图遍历损坏的堆时崩溃.

其他人是正确的,当他们指出你是sizeof (void*)从一个变量只读sizeof (bool),但由于它在堆栈上,内存刚刚超出s几乎肯定是有效的(它可能包含其他局部变量,函数参数,或返回地址,没有如果它们被无意读取,会导致程序崩溃).

memcpy 可以很好地读取未对齐的数据,所以即使你在一个在未对齐的访问上崩溃的架构,这也不是问题.

检查其他动态分配的缓冲区是否溢出.

编辑:我也想回应米洛对一个现已删除的问题的评论:

我需要获得可以分配的任何类型的对象 - 米洛

C++不能那样工作. malloc只能为POD类型分配内存,这必须满足一些非常强大的限制.完全没有符合标准的方法来克隆完全任意类型的实例.

在某些类型上可靠运行的一些方法是:

  • 如果类型具有带虚Clone函数的基类型,则以Clone多态方式调用
  • 如果类型是POD并且您知道大小,请使用new char[]memcpy