我想知道静态内存分配和动态内存分配有什么区别?
你能用任何一个例子解释一下吗?
c memory memory-management dynamic-memory-allocation static-memory-allocation
我偶然发现了一个涉及不同大小数组声明的测验。我想到的第一件事是我需要对new命令使用动态分配,如下所示:
while(T--) {
int N;
cin >> N;
int *array = new int[N];
// Do something with 'array'
delete[] array;
}
Run Code Online (Sandbox Code Playgroud)
但是,我看到其中一种解决方案允许以下情况:
while(T--) {
int N;
cin >> N;
int array[N];
// Do something with 'array'
}
Run Code Online (Sandbox Code Playgroud)
经过一番研究,我读到 g++ 允许这样做,但它让我一直在思考,在哪些情况下有必要使用动态分配?还是编译器将其翻译为动态分配?
包括删除功能。但是请注意,这里的问题与内存泄漏无关。
c++ arrays dynamic-memory-allocation static-memory-allocation
我目前正在使用带有64 KB SRAM的ARM Cortex M3处理器构建嵌入式系统.目前,我正在寻找一种方法来确保使用STL容器确定性能,其中包括确保在运行时不会最终耗尽内存.
我主要关注STL容器如何执行动态内存分配.虽然我可以利用自定义分配器让这些结构从我预留的池中获取内存,但我需要为每个结构设置一个单独的池,以确保结构的一个实例不能占用另一个实例的空间.
我正在与这个项目中的其他人一起工作,他们不想关注内存的原始分配,并且更愿意能够利用"众所周知的"数据结构(堆栈,队列,双端队列等).因此,我正在考虑围绕C阵列构建包装器以提供这些结构.这将支持静态分配支持这些容器所需的内存,并允许其他开发人员根据编译器提供的代码大小信息知道他们在运行时之前实例化的容器的大小.在我看来,这可以保证在运行时不会发生内存中断问题,并大大简化了系统设计.
另一种选择是在系统初始化时分配STL容器.在初始化期之后,不会发生额外的动态内存分配.但是,据我所知,标准C++ STL数据结构不支持这一点 - 它要求堆栈之类的容器能够预先分配(类似于向量).
对于我关于围绕标准C阵列构建类的提议有什么意见,我将不胜感激?另外,是否有更简单的方法在编译时分配静态大小的STL容器,例如静态大小的堆栈或队列?(我知道这可能是矢量,但其他我不确定)
注意:我已经阅读了另一个问题(嵌入式C++是否使用STL),但是这个问题的作者并未明确他们有多少内存(除了他们如何使用ARM7进程)或似乎是考虑类似于我的解决方案.
第二个注意:我知道对于一些开发人员来说,64 KB的SRAM可能看起来像很多内存.事实上,我已经在AVR处理器上进行了大量减少内存的开发,所以我理解这个观点.但是,从我目前的(可能是未知的)视图来看,在谈论STL容器时,64 KB的内存并不多.
c++ stl deterministic dynamic-memory-allocation static-memory-allocation
我是否应该更喜欢在堆栈或堆上初始化我的主要小部件,我有点困惑.在"使用QT 4进行C++ GUI编程"中,主要小部件在堆栈上初始化.在我说更多之前,我会解释我的意思:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow mainWin;
mainWin.show();
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
现在,也许这只是因为它更安全,也许是因为他们不想让读者混淆QT中的内存分配.对从QObject继承的对象留下任何删除肯定会让读者"忘记"使用QT对象进行内存管理.但是,我的问题是,我们应该更喜欢这种方法,还是以下方法:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow* mainWin = new MainWindow;
mainWin->show();
int execReturn = app.exec();
delete mainWin;
return execReturn;
}
Run Code Online (Sandbox Code Playgroud)
我提出这个问题的主要原因是我通常更愿意遵循选择堆与堆栈的模式:
现在,我想我的问题归结为两个问题:
我意识到QWidget本身不太可能导致堆栈溢出,但当然这将是我的应用程序可能具有的任何其他堆栈使用之上.
我正在阅读有关动态内存分配和静态内存分配的内容,并找到了有关动态内存分配的内容:
在前面章节中看到的程序中,通过定义所需的变量,在程序执行之前确定所有内存需求.但是可能存在程序的内存需求只能在运行时确定的情况.例如,当需要的内存取决于用户输入.
所以我用C++编写了以下程序:
#include <iostream>
int main()
{
int n = 0;
int i = 0;
std::cout << "Enter size: ";
std::cin >> n;
int vector[n];
for (i=0; i<n; i++)
{
vector[i] = i;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个程序有效.我不明白它是如何工作的.什么时候确定尺寸?在这种情况下如何分配向量?
考虑以下C代码:
#include <stdio.h>
#include<stdlib.h>
int main() {
int arrSize;
scanf("%d", &arrSize);
printf("%d\n",arrSize);
int *dynArr = (int *)malloc(sizeof(int)*arrSize);
int arr1[arrSize];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,arrSize是作为用户输入的数组的大小.以下观察结果是否正确:
i)dynArr是一个动态数组,它在运行时从堆部分分配内存.可以使用realloc函数修改dynArr的大小.
ⅱ).arr1也在运行时分配内存,但不是动态的,即它们的大小无法修改.内存是从堆栈或数据部分分配的.(不确定内存分配的堆或堆栈/数据部分以及原因).
注意:当我在这里说"静态字符串"时,我指的是realloc无法处理的内存.
嗨,我已经编写了一个带有char*参数的过程,我想创建一个副本,因为内存不能通过realloc重定位/调整大小.因此,该过程是一个"重型"字符串处理器,因此无论是否无效并且复制字符串,无论它是否是静态的,将来肯定会导致一些内存开销/处理问题.
我曾尝试使用异常处理程序来修改静态字符串,应用程序只是退出而没有任何通知.我退后一步,看看C并说:"我没有留下深刻的印象." 如果我听说过一个,那将是一个例外.
我试图使用异常处理程序在静态变量上调用realloc ... Glib报告说它找不到一些结构的私有信息(我敢肯定)我不知道并且显然在程序上调用abort意味着它不是一个可以用longjmp/setjmp或C++尝试捕获的异常,最后捕获.
我很确定必须有办法合理地做到这一点.例如,动态内存很可能不在静态内存附近的任何位置,所以如果有办法从地址泄露这些信息......我们可能只有一个宾果游戏.
我不确定C/C++预处理器中是否有任何宏可以识别宏参数的来源和类型,但如果没有,那将是非常愚蠢的.Macro Assemblers非常聪明.从缺乏强大的错误处理来判断,如果没有,我不会感到有点惊讶.
当您动态分配内存时,例如malloc(1024 * sizeof(char)),NULL如果没有足够的内存来满足请求,则结果指针将设置为。
当没有足够的内存来满足静态分配时会发生什么char c[1024]?
#include <stdio.h>
int main(void)
{
int a=17;
scanf("%d",&a);
int arr[a];
printf("%lu", sizeof(arr));
}
Run Code Online (Sandbox Code Playgroud)
数组"arr"的内存应该在编译时分配,但在这种情况下,它从用户(运行时)获取"a"的值并为数组分配相同的大小.请澄清.
我研究了很多静态和动态内存分配,但仍有一个混乱:
int n, i, j;
printf("Please enter the number of elements you want to enter:\t");
scanf("%d", &n);
int a[n];
for (i = 0; i < n; i++)
{
printf("a[%d] : ", i + 1);
scanf("%d", &a[i]);
}
Run Code Online (Sandbox Code Playgroud)
是否int a[n]都在静态或动态内存分配?
c memory-management dynamic-memory-allocation static-memory-allocation