gpt4 book ai didi

c - 释放对象的问题

转载 作者:太空宇宙 更新时间:2023-11-04 00:53:08 26 4
gpt4 key购买 nike

我目前正在尝试学习 C++ 的 C 方面。

我尝试为 256 的 char 数组malloc 一 block 内存,然后我给它分配了一个 char* "Hello World!" 但是当我释放对象时出现错误。

任何人都可以向我解释错误。

#include <exception>
#include <stdexcept>
#include <iostream>

int main()
{
void* charVoidPointer = malloc( sizeof(char) * 256 ) ;
charVoidPointer = "Hello World";

std::cout << (char *)charVoidPointer;
free (charVoidPointer);
}

最佳答案

“Hello World”由编译器静态分配。它是程序的一部分,存在于程序可寻址的某个地方;称之为地址 12。

charVoidPointer 最初指向某个由 malloc 为您分配的位置;称它为地址 98。

charVoidPointer = "Hello ..."使 charVoidPointer 指向您程序中的数据;地址 12。您丢失了先前包含在 charVoidPointer 中的地址 98。

而且你不能释放不是由 malloc 分配的内存。

为了更真实地展示我的意思:

void* charVoidPointer = malloc(sizeof(char) * 256);
printf("the address of the memory allocated for us: %p\n", charVoidPointer);
charVoidPointer = "Hello World";
printf("no longer the address allocated for us; free will fail: %p\n",
charVoidPointer);

你的意思是:

strcpy(charVoidPointer, "Hello World");

编辑:其他类型的寻址内存示例

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{
// an array of 10 int
int *p = (int*)malloc(sizeof(int) * 10);

// setting element 0 using memcpy (works for everything)
int src = 2;
memcpy(p+0, &src, sizeof(int));

// setting element 1 using array subscripts. correctly adjusts for
// size of element BECAUSE p is an int*. We would have to consider
// the size of the underlying data if it were a void*.
p[1] = 3;

// again, the +1 math works because we've given the compiler
// information about the underlying type. void* wouldn't have
// the correct information and the p+1 wouldn't yield the result
// you expect.
printf("%d, %d\n", p[0], *(p+1));

free (p);
}

实验;将类型从 int 更改为 long、double 或一些复杂类型。

关于c - 释放对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11485326/

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