标签: dynamic-allocation

为什么必须动态分配Objective-C对象?

为什么必须动态分配Objective-c对象?为什么我必须使它成为指向对象的指针,与C++不同,我可以在堆栈上创建它们?谢谢.

cocoa objective-c-runtime foundation static-allocation dynamic-allocation

16
推荐指数
1
解决办法
3208
查看次数

编写C函数的正确方法是什么?返回char数组?

我对Java非常熟悉,在C中则不是这样.

在Java中,如果我有一个方法可以做某事并返回一个String,它看起来像:

private String doSomething(...) {
    String s;
    // do something;
    return s;
}
Run Code Online (Sandbox Code Playgroud)

C中的句法等价物不起作用,是完全错误的:

char* doSomething(...) {
    char s[100];
    // do something;
    return s;
}
Run Code Online (Sandbox Code Playgroud)

当然我能做到:

char* doSomething(...) {
    char *s;
    s = malloc(100 * sizeof(char));
    // do something;
    return s;
}
Run Code Online (Sandbox Code Playgroud)

这会工作(我想!)但我很少看到代码这样做(是因为它不必要地填充堆?)

最常见的是,我看到:

bool doSomething(char *s) {
    // do something that copies chars to s
    return true;
}
Run Code Online (Sandbox Code Playgroud)

调用语句将是:

char s[100];
doSomething(s);
Run Code Online (Sandbox Code Playgroud)

如果在函数本身内部之前我不知道char数组的大小怎么办?即我无法在函数外声明char数组,然后将其传入.

处理这种情况的正确方法是什么?

c string dynamic-allocation

16
推荐指数
2
解决办法
1319
查看次数

动态分配数组的大小

分配给动态分配的数组的起始地址的指针是否不具有数组大小的信息?所以我们必须使用另一个变量来存储它的大小,以便稍后通过指针处理数组.

但是当我们释放动态分配的数组时,我们不指定大小,而只是"free ptr"或"delete [] ptr".如何释放或删除知道数组的大小?我们可以使用相同的方案来避免将数组的大小存储在另一个变量中吗?

谢谢!

c c++ dynamic-allocation

15
推荐指数
2
解决办法
4450
查看次数

有没有理由不使用calloc而不是malloc?

calloc()几天我刚刚了解了C 功能.看了它的描述和它有什么不同malloc(1,2),我的想法是,作为非嵌入式程序员,我应该总是使用calloc().但情况确实如此吗?

我有一个保留是访问calloc()-ed内存的额外延迟,但我也想知道是否有时候切换malloc()calloc()将以更严重的方式破坏程序.

PS零初始化方面calloc()对我来说非常清楚.我有兴趣了解的是calloc()malloc()- 懒惰内存分配之间的另一个区别calloc().如果您要专注于内存初始化方面,请不要发布答案.

c c++ malloc calloc dynamic-allocation

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

获取堆上对象的大小(以字节为单位)

我知道你可以MemoryLayout<T>.size用来获得一个类型的大小T.

例如: MemoryLayout<Int32>.size // 4

但是,对于类实例(对象),MemoryLayout<T>.size返回对象的引用大小(64位计算机上的8个字节),而不是堆上实际对象的大小.

class ClassA { // Objects should be at least 8 bytes
    let x: Int64 = 0
}

class ClassB  {// Objects should be at least 16 bytes
    let x: Int64 = 0
    let y: Int64 = 0
}

MemoryLayout<ClassA>.size // 8
MemoryLayout<ClassB>.size // 8, as well :(
Run Code Online (Sandbox Code Playgroud)

如何获得物体的大小?

对于那些想知道的人,我没有真正的需要,我只是在探索Swift及其与C的互操作性.

heap-memory memory-layout dynamic-allocation swift

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

分配初始化的对齐内存

我正在编写一个程序(在C++中),我需要在其中分配其起始地址应与缓存行大小对齐的数组.当我分配这些数组时,我也希望将内存初始化为零.

现在我使用posix_memalign函数工作了.这适用于获取内存对齐的数组,但数组未经过限制.有什么更好的函数可以用来在我初始化它们时将数组清零,或者我是否只需要为我编写一个单独的循环来解决它?

c c++ posix memory-alignment dynamic-allocation

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

使用calloc()而不是malloc()和memset()有什么好处吗?

我想知道是否calloc()优于a malloc后跟a memset.后者似乎是分配和初始化内存的最常用方式.

一个GitHub的代码搜索变成了许多calloc测试和实现,但在页面的第一个数字代码没有实际使用calloc.

有谁知道任何使用或推荐使用的项目/组织calloc以及推荐它的情况?

从下面的评论和答案中,以下是迄今为止出现的一些想法:

  • calloc(n, size) 可以防止溢出 malloc(n * size)

  • 结合mallocmemset使calloc有机会请求已知已经归零的页面.

  • calloc的一个缺点是组合的步骤可能会排除malloc周围的其他包装器.

c malloc memory-management calloc dynamic-allocation

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

我可以在C中释放()静态和自动变量吗?

代码如下:

#include <stdlib.h>

int num = 3;   // Static external variable
int *ptr = &num;

int main(void)
{
 int num2 = 4;  // Automatic variable
 int *ptr2 = &num2;

 free(ptr);  //Free static variable
 free(ptr2); //Free automatic variable

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

我尝试编译上面的代码,它的工作原理,我很好奇free()功能是否能够释放静态变量和自动变量?或者基本上什么也没做?

c free scope static-variables dynamic-allocation

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

使用new运算符创建用户输入大小的数组

我有几个与数组相关的问题.我已经研究过,数组大小必须是常量的,声明/编译器必须知道它的值.但是使用GNU GCC编译器(C++ 11标准过滤器),我能够使用变量作为数组大小完美地编译和运行程序,同时动态声明所述数组(使用new)

int num;
cout << "How big an array? ";
cin >> num;
int *arr = new int [num];
Run Code Online (Sandbox Code Playgroud)

问题1)这被认为是标准吗?我的教授是矛盾的.

Ques2)如果它标准的,那么在创建之后是否可以扩展数组(或任何数组)的大小?

Ques3)同样,如果这个表达式是标准的,那么是否可以在函数中使用它 - 例如.使用函数创建这样的数组?(如果是这样,怎么样?)

(PS:嗨,我是新手,也是C++的新手)

c++ arrays dynamic-allocation

8
推荐指数
1
解决办法
1851
查看次数

删除动态分配的矢量是否清除它的内容

说我有:

vector<string>* foo = new vector<string>();
Run Code Online (Sandbox Code Playgroud)

我添加了大量的东西,使用它,然后我只是打电话:

delete foo;
Run Code Online (Sandbox Code Playgroud)

我需要先打个电话foo.clear();吗?或者将delete调用析构函数.

请不要对此有愚蠢的评论,我知道至少应该在这里使用自动指针.这种行为是在我正在使用的代码库中,我可以去修复它.

c++ destructor vector clear dynamic-allocation

8
推荐指数
1
解决办法
778
查看次数