1

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

我尝试malloc为 char 数组分配一块内存,256然后分配给它 achar* "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);
}
4

4 回答 4

2
void* charVoidPointer = malloc( sizeof(char) * 256 ) ;

现在charVoidPointer(顺便说一句奇怪的名字——如果你想要字符,使用char *并转换从 malloc 返回的指针)指向一个 256 个字符的块。这个块是未初始化的,所以你能做的几乎唯一有效的事情就是将它们全部设置为某个值,或者复制一些东西。

charVoidPointer = "Hello World";

现在charVoidPointer指向一个静态分配的字符数组,并且您丢失了 malloc 返回的地址。没有办法找回它,所以这是资源泄漏。


您的代码应类似于:

char *charPointer = (char *)malloc(256);
strcpy(charPointer, "Hello World");

它将字符数组复制到您分配的块中。或者,更简洁地说,只是

char *charPointer = strdup("Hello World");

这将分配一个大小合适的块并将字符串复制进去。您仍然可以使用free.

于 2012-07-14T16:22:46.550 回答
2

“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 或某些复杂类型。

于 2012-07-14T16:23:28.843 回答
1

使用strcpy(charVoidPointer, "Hello World");,因为在您的示例中,您重新分配了指针。

于 2012-07-14T16:18:20.297 回答
1

您将指针分配给字符串文字“Hello World”的地址,因此您 malloc 的内存块被泄漏。

你应该使用

strcpy(charVoidPointer, "Hello World");

而不是赋值运算符。

更好的是用来strncpy(charVoidPointer, "Hello World", 255);避免你分配的数组溢出。

于 2012-07-14T16:18:43.613 回答