标签: dynamic-memory-allocation

你能在堆上声明一个指针吗?

这是在C++中在堆上创建变量的方法:

T *ptr = new T;
Run Code Online (Sandbox Code Playgroud)

ptr显然是指向新T的指针.我的问题是,你能做到这一点:

T *ptr = new T*;
Run Code Online (Sandbox Code Playgroud)

这似乎可能导致一些非常非常危险的代码.有谁知道这是否可行/如何正确使用它?

c++ heap-memory dynamic-memory-allocation

11
推荐指数
2
解决办法
7405
查看次数

我什么时候应该使用calloc而不是malloc

这是来自Beej的C指南 "使用calloc()的缺点是清理内存需要时间,在大多数情况下,你不需要它清楚,因为你无论如何都只是在写它.但是如果你永远发现你自己malloc()一个块,然后将内存设置为零,你可以使用calloc()在一次调用中做到这一点."

那么当我想要将内存清零时,可能出现的情况是什么.

c pointers dynamic-memory-allocation

10
推荐指数
2
解决办法
8928
查看次数

在C++中,一个线程中的new可以分配另一个线程删除的内存吗?

在glibc中,malloc用arenas实现.因此,例如,由于线程A和B可能位于不同的场所,并且不同的场所保持不同的堆,并且线程A中的另一个调用不能使用线程A中首先分配的内存malloc和后来的内存.免费的记忆清单.freemalloc

谈到C++(也许是C++ 11,因为C++ 11有一个新标准),故事是否仍然相同?

或者不同的线程实际上共享相同的堆段和内存空闲列表,并且new在一个线程中可以先分配内存,new然后再delete由另一个线程分配d?

如果答案是依赖于实现的,那么问题是它们是如何在主要的C++编译器中实现的,例如g ++,MVC++,icc?

编辑

我认为这个问题在某种意义上是有效的,有时你会启动许多线程,并且在每个线程中你为大量对象动态分配/释放大量内存,并且你不希望你的应用程序使用内存高得离谱.

c++ multithreading memory-management dynamic-memory-allocation c++11

10
推荐指数
1
解决办法
1949
查看次数

内存分配功能是否表示不再使用内存内容?

当处理某些数据流(例如,来自网络的请求)时,使用一些临时存储器是很常见的.例如,URL可以分成多个字符串,每个字符串可能从堆中分配内存.这些实体的使用通常是短暂的,并且内存总量通常相对较小,应该适合CPU缓存.

在用于临时字符串的内存被释放时,字符串内容很可能只存在于缓存中.但是,CPU并不知道要释放的内存:释放只是内存管理系统中的更新.结果,当CPU高速缓存用于其他存储器时,CPU可能最终不必要地将未使用的内容写入实际存储器 - 除非存储器释放以某种方式向CPU指示存储器不再被使用.因此,问题变为:

释放内存的内存管理功能是否表示可以丢弃相应内存的内容?有没有办法向CPU指示不再使用内存?(至少,对于某些CPU:显然,架构之间可能存在差异)由于不同的实现可能会在质量上有所不同,可能会或可能不会做任何花哨的事情,问题实际上是否有任何内存管理实现将内存指示为未使用?

我确实意识到始终使用相同的内存领域可能是一种缓解策略,以避免对实际内存的不必要写入.在这种情况下,将使用相同的缓存内存.类似地,内存分配可能总是产生相同的内存,也避免了不必要的内存传输.但是,我可能不需要依赖任何适用的技术.

memory performance memory-management dynamic-memory-allocation cpu-cache

10
推荐指数
1
解决办法
408
查看次数

没有或例外?

我是一名学生,我对C++知之甚少,我试图扩展它.这更像是一个哲学问题.我不是想要实现某些东西.

以来

#include <new> 
//...
T * t = new (std::nothrow) T();
if(t)
{
    //...
}
//...
Run Code Online (Sandbox Code Playgroud)

将隐藏异常,并且因为与简单相比处理异常更重if(t),为什么不正常new T()不被认为是不太好的做法,考虑到我们将不得不try-catch()用来检查简单分配是否成功(如果我们不成功,只是看程序死了)?

new与使用nothrow new?相比,正常分配有哪些好处(如果有的话)?在这种情况下,例外的开销是微不足道的?

此外,假设分配失败(例如,系统中不存在内存).程序在那种情况下可以做什么,或者只是优雅地失败.当保留所有内存时,无法在堆上找到空闲内存吗?

如果分配失败,并且a std::bad_allocthrown,我们如何假设由于没有足够的内存来分配对象(例如a new int),将有足够的内存来存储异常?

谢谢你的时间.我希望这个问题符合规则.

c++ out-of-memory new-operator dynamic-memory-allocation

9
推荐指数
2
解决办法
4354
查看次数

Malloc函数(动态内存分配)在全局使用时导致错误

#include<stdio.h>
#include<string.h>
char *y;
y=(char *)malloc(40); // gives an error here
int main()
{
    strcpy(y,"hello world");
}
Run Code Online (Sandbox Code Playgroud)
error: conflicting types for 'y'
error: previous declaration of 'y' was here
warning: initialization makes integer from pointer without a cast
error: initializer element is not constant
warning: data definition has no type or storage class
warning: passing arg 1 of `strcpy' makes pointer from integer without cast
Run Code Online (Sandbox Code Playgroud)

现在真正的问题是,我们不能在全球范围内进行动态内存分配吗?为什么在全局使用malloc时会显示错误?如果我把malloc语句放在main函数或其他函数中,代码就没有错误.为什么会这样?

#include<stdio.h>
#include<string.h>
char *y;
int main()
{
    y=(char *)malloc(40); 
    strcpy(y,"hello world");
}
Run Code Online (Sandbox Code Playgroud)

c malloc global-variables dynamic-memory-allocation

9
推荐指数
1
解决办法
2万
查看次数

该数组是静态的,但直到运行时才知道数组大小.这怎么可能?

这让我困扰了一段时间.它是我(缺乏)理解静态和动态内存分配之间差异的核心.以下数组是一个普通的静态数组,它应该意味着内存是在编译期间分配的,对吗?然而,我已经设置好了,以便用户在运行时输入数组大小.

#include <iostream>
using namespace std;

int main() {
  cout << "how many elements should the array hold? ";
  int arraySize;
  cin >> arraySize;

  int arr[arraySize];

  for (int i = 0; i < arraySize; ++i)
    arr[i] = i * 2;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,此程序中没有newdelete运算符.它在Xcode 4.2(默认的Clang编译器)以及我学校的UNIX服务器(GCC 4.4.5)中工作正常.arr在编译时创建数组时,编译器如何知道要分配多少内存?这只是我的编译器的侥幸,危险的代码,可能会破坏其他内存,或者这是合法的吗?

c++ arrays dynamic-memory-allocation dynamic-arrays

9
推荐指数
2
解决办法
2579
查看次数

检测到严重错误c0000374 - C++ dll将已分配内存的指针返回给C#

我有一个c ++ dll,它为我的主要c#应用程序提供一些功能.在这里,我尝试读取文件,将其加载到内存,然后将一些信息(如指针加载数据和内存块计数)返回到c#.Dll成功将文件读取到内存,但在返回主应用程序时,程序因堆损坏而崩溃(检测到严重错误c0000374).

代码非常简单明了,之前我做过类似的事情没有问题,但是我无法弄清楚是什么原因导致问题,我尝试使用"new,malloc和GlobalAlloc"分配内存,但都没有帮助.代码如下:

C++ MyDll:

typedef unsigned long         U32;

extern "C" __declspec(dllexport) int ReadFile(LPSTR Path, U32** DataPtr, U32* Count)
{
   FILE *fp;
   U32 *Data;
   CString tempStr(Path);
   long fSize;

   if(!(fp = fopen(tempStr, "rb"))) {
    return 0;
   }

   // Obtain File Size;
   fseek(fp, 0, SEEK_END);
   fSize =  ftell(fp);
   rewind(fp);

   Data = (U32 *)GlobalAlloc(0, fSize);
   if(Data == NULL) {
            fclose(fp);
            return -1;
    }

    // Copy file into the buffer.
        if(!(*Count = fread(Data, sizeof(U32), fSize / sizeof(U32), fp))) {
           fclose(fp);
           free(Data);
           return -2; …
Run Code Online (Sandbox Code Playgroud)

c# c++ dll dynamic-memory-allocation heap-corruption

9
推荐指数
2
解决办法
6万
查看次数

Java数组初始化为零大小

在java中声明一个数组时,我们必须使用new关键字动态分配内存.

class array
{
  public static void main(String ars[]) { 
    int A[] = new int[10];
    System.out.println(A.length);
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码将创建一个包含10个元素的1D数组,每个元素4个字节.并且输出将是10.但是,当您运行以下相同的代码时:

class array { 
  public static void main(String ars[]) {
    int A[] = new int[0];
    System.out.println(A.length);
  }
}
Run Code Online (Sandbox Code Playgroud)

输出是0.我想知道你写的new int[0]时候Java是否为数组分配了一些内存?如果是多少钱?

java arrays dynamic-memory-allocation

9
推荐指数
1
解决办法
578
查看次数

C++:如果我重载new运算符,我是否也必须重载delete运算符?

我正在阅读关于SO的问题,在其中一个答案中,它被提到:

如果找不到明确的匹配解除分配函数,则传播异常不会导致释放对象的内存.

所以,如果我只是重载我的new运算符而不是delete运算符,那么是否delete会创建并调用任何默认运算符; 或者,我是否还必须delete明确地编写运算符.

c++ new-operator dynamic-memory-allocation delete-operator

9
推荐指数
1
解决办法
197
查看次数