为什么必须动态分配Objective-c对象?为什么我必须使它成为指向对象的指针,与C++不同,我可以在堆栈上创建它们?谢谢.
cocoa objective-c-runtime foundation static-allocation dynamic-allocation
我对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数组,然后将其传入.
处理这种情况的正确方法是什么?
分配给动态分配的数组的起始地址的指针是否不具有数组大小的信息?所以我们必须使用另一个变量来存储它的大小,以便稍后通过指针处理数组.
但是当我们释放动态分配的数组时,我们不指定大小,而只是"free ptr"或"delete [] ptr".如何释放或删除知道数组的大小?我们可以使用相同的方案来避免将数组的大小存储在另一个变量中吗?
谢谢!
我知道你可以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的互操作性.
我正在编写一个程序(在C++中),我需要在其中分配其起始地址应与缓存行大小对齐的数组.当我分配这些数组时,我也希望将内存初始化为零.
现在我使用posix_memalign函数工作了.这适用于获取内存对齐的数组,但数组未经过限制.有什么更好的函数可以用来在我初始化它们时将数组清零,或者我是否只需要为我编写一个单独的循环来解决它?
我想知道是否calloc()优于a malloc后跟a memset.后者似乎是分配和初始化内存的最常用方式.
一个GitHub的代码搜索变成了许多calloc测试和实现,但在页面的第一个数字代码没有实际使用calloc.
有谁知道任何使用或推荐使用的项目/组织calloc以及推荐它的情况?
从下面的评论和答案中,以下是迄今为止出现的一些想法:
calloc(n, size) 可以防止溢出 malloc(n * size)
结合malloc和memset使calloc有机会请求已知已经归零的页面.
calloc的一个缺点是组合的步骤可能会排除malloc周围的其他包装器.
代码如下:
#include <stdlib.h>
int num = 3; // Static external variable
int *ptr = #
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()功能是否能够释放静态变量和自动变量?或者基本上什么也没做?
我有几个与数组相关的问题.我已经研究过,数组大小必须是常量的,声明/编译器必须知道它的值.但是使用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++的新手)
说我有:
vector<string>* foo = new vector<string>();
Run Code Online (Sandbox Code Playgroud)
我添加了大量的东西,使用它,然后我只是打电话:
delete foo;
Run Code Online (Sandbox Code Playgroud)
我需要先打个电话foo.clear();吗?或者将delete调用析构函数.
请不要对此有愚蠢的评论,我知道至少应该在这里使用自动指针.这种行为是在我正在使用的代码库中,我可以去修复它.