Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行时分配内存 我想知道,在C或C++中,如何在运行时< /强>中分配内存块,而不使用 Malc C < /C>和 CaloC < P> C中,使用 MalOC/。使用后不要忘记免费 在C++中,使用新< /代码>,不要忘记删除< /代码>。如果需要动态数组,最好使用std::vector。_C++_C_Memory Management - Fatal编程技术网

在运行时分配内存 我想知道,在C或C++中,如何在运行时< /强>中分配内存块,而不使用 Malc C < /C>和 CaloC < P> C中,使用 MalOC/。使用后不要忘记免费 在C++中,使用新< /代码>,不要忘记删除< /代码>。如果需要动态数组,最好使用std::vector。

在运行时分配内存 我想知道,在C或C++中,如何在运行时< /强>中分配内存块,而不使用 Malc C < /C>和 CaloC < P> C中,使用 MalOC/。使用后不要忘记免费 在C++中,使用新< /代码>,不要忘记删除< /代码>。如果需要动态数组,最好使用std::vector。,c++,c,memory-management,C++,C,Memory Management,在C语言中,可以使用: malloc() 在C++中: malloc() calloc() 在C++中,最好使用新的算符。 我不确定你的问题,但简单的答案是使用< /P> C: C++: 这将返回一个指向内存的指针,操作系统会为你找到它。 < P>在C中,或者在C++中。< P> > C使用 MalCube()> < /P> int*a=malloc(sizeof(int)*块大小) 在C++中使用新< /COD> int*a=新的int[block_size] 注意:此代码使用原始指

在C语言中,可以使用:

malloc() 
在C++中:

malloc()
calloc()

在C++中,最好使用新的算符。

我不确定你的问题,但简单的答案是使用< /P> C:

C++:

这将返回一个指向内存的指针,操作系统会为你找到它。

< P>在C中,或者在C++中。

< P> > C使用<代码> MalCube()> <代码> < /P>
int*a=malloc(sizeof(int)*块大小)

在C++中使用<代码>新< /COD>

int*a=新的int[block_size]

注意:此代码使用原始指针。C++11具有更好的指针,例如
unique\u ptr
shared\u ptr
。通常,与原始指针相比,更喜欢这些智能指针是一种很好的做法

编辑:OP需要一个块,所以我正在用VLA更新C中的代码

/* fill an array, allocated dinamically without malloc,
** with 1, 2, 3, 4, ...
** then sum all of the values and print the result */
#include <stdio.h>

void vlaalloc(size_t nmemb, size_t siz, void (*fx) (void *, size_t)) {
  unsigned char data[nmemb * siz];

  fx(data, nmemb);
}

int arraysum(int *arr, size_t len) {
  int val = 0;
  for (size_t i = 0; i < len; i++) val += arr[i];
  return val;
}

void seq(void *data, size_t len) {
  int *arr = data;
  for (size_t i = 0; i < len; i++) arr[i] = i + 1;
  printf("array sum is %d\n", arraysum(arr, len));
}

int main(void) {
  int n;

  if (scanf("%d", &n) == 1) {
    vlaalloc(n, sizeof (int), seq);
  }
}
/*填充一个数组,在不使用malloc的情况下以二进制方式分配,
**用1,2,3,4。。。
**然后对所有值求和并打印结果*/
#包括
void vlaalloc(大小为nmemb、大小为siz、大小为(*fx)(大小为*、大小为)){
无符号字符数据[nmemb*siz];
外汇(数据,nmemb);
}
内部阵列(内部*阵列,尺寸长度){
int-val=0;
对于(size_t i=0;i

参见

< P>除非我错过了问题的要点,正如已经提出的,你只需要使用C++语言标准结构:新的和Dele/Dele[]/

> P>在C中,所有内存分配都是通过MALOC(它在规则中)完成的,所以如果你想要的东西不是MALOC,那要看你使用的是什么平台,而你没有说

在Linux上,mmap可能会执行您想要的操作。毫无疑问,windows还有其他功能


在某些系统上,只要您知道所有东西都在哪里,您可能不需要询问就可以获取它,但这主要只适用于使用基本(或无)操作系统的嵌入式系统。

请参阅相关问题:您需要获取。您可能需要浏览一些教程。堆栈溢出不是学习语言的好地方。而且这肯定不是一个学习两种语言的好地方!。。。为什么不呢?
malloc
有什么问题?@Xeo:这个问题专门讨论分配内存(而不是构造对象或原语值)。因此,指出C++的代码> Malc 和 CaloC当然不是错误的(虽然可以说是不完整的)。@ FrerichRaabe:我们仍然有一个<代码>新的< /代码>:<代码>::运算符new(STD:SIZEZT大小)< /C>。一般来说,C++中,你不仅要分配内存。<代码> CaloC是C函数,它不是C++特定的。@ XEO:这是正确的(我同意显式资源管理不是一个好主意),但是再次使用“代码> MalOC 当然可以在运行时分配一个内存块,就像OP所要求的那样。在实现您提到的
重载时,这是一个合理的函数!请注意,答案中确实提到了
,最好也使用新的运算符
。@FrerichRaabe:我可以发誓,最后一句话是在我的评论之后编辑的。。。无论如何。我的意思是,(大部分时候)C++中没有好的理由只分配内存而不在其中构建一些东西。如果您发现自己需要这样做,那么您要么实现一个库,要么在玩一些不应该玩的东西。如果你属于前一组,你应该使用
std::vector
或类似的方法。在C中,不要使用
malloc
的返回值。演员阵容充其量是多余的;并且可能会隐藏编译器在没有它的情况下会发现的错误。C++03有
自动\u ptr
,它不如
唯一\u ptr
,但实现了自动清理。但反过来
自动\u ptr
有很多问题,所以最好使用boost智能指针。很抱歉,我忘了提到这是在没有malloc和calloc的情况下完成的。@AmitSharma:那么你需要使用特定于平台的API
malloc
是标准C中唯一的可移植动态分配机制。new和delete在后台使用malloc和free。不,它们可能会。但他们根本不必这么做。
new
/* fill an array, allocated dinamically without malloc,
** with 1, 2, 3, 4, ...
** then sum all of the values and print the result */
#include <stdio.h>

void vlaalloc(size_t nmemb, size_t siz, void (*fx) (void *, size_t)) {
  unsigned char data[nmemb * siz];

  fx(data, nmemb);
}

int arraysum(int *arr, size_t len) {
  int val = 0;
  for (size_t i = 0; i < len; i++) val += arr[i];
  return val;
}

void seq(void *data, size_t len) {
  int *arr = data;
  for (size_t i = 0; i < len; i++) arr[i] = i + 1;
  printf("array sum is %d\n", arraysum(arr, len));
}

int main(void) {
  int n;

  if (scanf("%d", &n) == 1) {
    vlaalloc(n, sizeof (int), seq);
  }
}