这是在C++中在堆上创建变量的方法:
T *ptr = new T;
Run Code Online (Sandbox Code Playgroud)
ptr显然是指向新T的指针.我的问题是,你能做到这一点:
T *ptr = new T*;
Run Code Online (Sandbox Code Playgroud)
这似乎可能导致一些非常非常危险的代码.有谁知道这是否可行/如何正确使用它?
这是来自Beej的C指南 "使用calloc()的缺点是清理内存需要时间,在大多数情况下,你不需要它清楚,因为你无论如何都只是在写它.但是如果你永远发现你自己malloc()一个块,然后将内存设置为零,你可以使用calloc()在一次调用中做到这一点."
那么当我想要将内存清零时,可能出现的情况是什么.
在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
当处理某些数据流(例如,来自网络的请求)时,使用一些临时存储器是很常见的.例如,URL可以分成多个字符串,每个字符串可能从堆中分配内存.这些实体的使用通常是短暂的,并且内存总量通常相对较小,应该适合CPU缓存.
在用于临时字符串的内存被释放时,字符串内容很可能只存在于缓存中.但是,CPU并不知道要释放的内存:释放只是内存管理系统中的更新.结果,当CPU高速缓存用于其他存储器时,CPU可能最终不必要地将未使用的内容写入实际存储器 - 除非存储器释放以某种方式向CPU指示存储器不再被使用.因此,问题变为:
释放内存的内存管理功能是否表示可以丢弃相应内存的内容?有没有办法向CPU指示不再使用内存?(至少,对于某些CPU:显然,架构之间可能存在差异)由于不同的实现可能会在质量上有所不同,可能会或可能不会做任何花哨的事情,问题实际上是否有任何内存管理实现将内存指示为未使用?
我确实意识到始终使用相同的内存领域可能是一种缓解策略,以避免对实际内存的不必要写入.在这种情况下,将使用相同的缓存内存.类似地,内存分配可能总是产生相同的内存,也避免了不必要的内存传输.但是,我可能不需要依赖任何适用的技术.
memory performance memory-management dynamic-memory-allocation cpu-cache
我是一名学生,我对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_alloc为thrown,我们如何假设由于没有足够的内存来分配对象(例如a new int),将有足够的内存来存储异常?
谢谢你的时间.我希望这个问题符合规则.
#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) 这让我困扰了一段时间.它是我(缺乏)理解静态和动态内存分配之间差异的核心.以下数组是一个普通的静态数组,它应该意味着内存是在编译期间分配的,对吗?然而,我已经设置好了,以便用户在运行时输入数组大小.
#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)
请注意,此程序中没有new或delete运算符.它在Xcode 4.2(默认的Clang编译器)以及我学校的UNIX服务器(GCC 4.4.5)中工作正常.arr在编译时创建数组时,编译器如何知道要分配多少内存?这只是我的编译器的侥幸,危险的代码,可能会破坏其他内存,或者这是合法的吗?
我有一个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) 在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是否为数组分配了一些内存?如果是多少钱?
我正在阅读关于SO的问题,在其中一个答案中,它被提到:
如果找不到明确的匹配解除分配函数,则传播异常不会导致释放对象的内存.
所以,如果我只是重载我的new运算符而不是delete运算符,那么是否delete会创建并调用任何默认运算符; 或者,我是否还必须delete明确地编写运算符.
c++ ×6
arrays ×2
c ×2
new-operator ×2
c# ×1
c++11 ×1
cpu-cache ×1
dll ×1
heap-memory ×1
java ×1
malloc ×1
memory ×1
performance ×1
pointers ×1