我需要一些有关c ++内存管理和MISRA指南的说明。
我必须实现一个与MISRA兼容的程序,因此我必须遵守一条重要规则:不可能使用“ new”运算符(动态内存堆)。
在这种情况下,对于任何自定义对象,我必须使用静态分配:
例如:
我的班上Student有一个构造函数Student(int age)。每当我必须实例化Student对象时,都必须采用这种方式:
int theAge = 18;
Student exampleOfStudent(theAge);
Run Code Online (Sandbox Code Playgroud)
这将创建一个Student对象exampleOfStudent。这样,我不必担心我不使用析构函数。这一切对吗?还有其他使用静态内存管理的方法吗?我可以以相同的方式使用std :: vector或其他数据结构吗?我是否可以将例如Student实例(我作为Student exampleOfStudent(theAge)创建的实例)添加到std :: vector中。
c++ memory-management misra new-operator static-memory-allocation
我在嵌入式系统中听说过,我们应该使用一些预先分配的固定大小的内存块(比如好友内存系统?).有人能给我一个详细的解释原因吗?谢谢,
embedded memory-management dynamic-memory-allocation static-memory-allocation
我知道以下情况的区别:
case 1: int a[10];
Run Code Online (Sandbox Code Playgroud)
对于情况 1,数组的内存在堆栈上分配。
case 2: int *a = new int[10];
Run Code Online (Sandbox Code Playgroud)
对于情况 2,在堆上分配内存并返回一个指针。
但是下面两个声明有什么区别,因为向量内存总是分配在堆上
vector<int> v1;
vector<int> *v2 = new vector<int>();
Run Code Online (Sandbox Code Playgroud) c++ stdvector dynamic-memory-allocation static-memory-allocation
我想了解为什么动态分配多次调用的数据使用的内存比在代码上直接指定的内存或通过单次调用分配的那样多malloc.
例如,我在C中制作了以下两个代码:
test1.c:int x分配有malloc
int main (void)
{
int *x;
int i, n=1048576; //n=1024*1024;
printf("size = %lu\n", n* sizeof(int));
for(i=0; i<n; i++)
{
x = malloc(sizeof(int));
*x=i;
}
printf("Look at top and then press something to finish.");fflush(stdout);
getc(stdin);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我没有在这里免费使用它来保持简单.当程序等待交互时,我查看另一个终端中的top函数,它显示了这个:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1384 root 20 0 41300 34076 1300 S 0.0 3.3 0:00.47 test1
Run Code Online (Sandbox Code Playgroud)
test2.c:int x未动态分配
int main (void)
{ …Run Code Online (Sandbox Code Playgroud) c malloc memory-management dynamic-memory-allocation static-memory-allocation
我写了一个简单的代码,我在创建没有固定大小的数组.我尝试编译代码gcc,它工作正常.请解释为什么这个工作数组大小应该在编译时知道.
这是我用过的代码.
void f(int k)
{
int a[k];
.....//some operation
}
int main()
{
int i = 10;
f(10);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 假设我上课了...
class Foo
{
public:
Foo(int size);
private:
const int size;
int data[];
};
Run Code Online (Sandbox Code Playgroud)
假设在实例化时立即设置了size字段,如何data根据该大小输入设置长度?
我通常会在std::vector这里使用,但我正在为Arduino编写一个库,所以它不会飞,我试图避免外部依赖,如果可以的话.
可能这个问题已经被问过,但我找不到。如果您看到什么,请重定向我。 问题: 使用有什么好处:
myClass* pointer;
Run Code Online (Sandbox Code Playgroud)
超过
myClass* pointer = new(myClass);
Run Code Online (Sandbox Code Playgroud)
通过阅读其他主题,我了解到第一个选项在堆栈上分配一个空间并使指针指向它,而第二个选项在堆上分配一个空间并使指针指向它。但我还读到,第二个选项很乏味,因为您必须通过删除来释放空间。那么为什么人们会使用第二种选择呢?我是个菜鸟所以请详细解释。
编辑
#include <iostream>
using namespace std;
class Dog
{
public:
void bark()
{
cout << "wouf!!!" << endl;
}
};
int main()
{
Dog* myDog = new(Dog);
myDog->bark();
delete myDog;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和
#include <iostream>
using namespace std;
class Dog
{
public:
void bark()
{
cout << "wouf!!!" << endl;
}
};
int main()
{
Dog* myDog;
myDog->bark();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
两者都编译并给我“wouf!!!”。那么为什么我应该使用“new”关键字呢?
c++ pointers class dynamic-memory-allocation static-memory-allocation
使用有什么区别
float* f;
Run Code Online (Sandbox Code Playgroud)
和
float f[4];
Run Code Online (Sandbox Code Playgroud)
或者他们的处理方式完全相同?使用一个而不是另一个可能会导致您遇到内存分配问题吗?如果没有,是否有任何情况下他们被区别对待?
不知道这是否相关,但我使用类型 float* 作为函数参数。例如:
void myfun(float* f){
f[0] = 0;
f[1] = 1;
f[2] = 2;
f[3] = 3;
}
Run Code Online (Sandbox Code Playgroud)
它编译并运行良好(我不确定为什么 - 我认为因为我没有分配任何内存f,它会抛出某种异常)。