动态分配数组(实现动态大小的向量)

3
在 obj-c 中,我们可以按照以下方式创建向量对象:
SomeClass* example[100];

或者

int count[7000];

但是如果我们只在初始化类的时候知道向量的大小呢?(也许我们需要 example[756] 或 count[15])


C++还是Objective-C?只能选一个,不能两个都选。 - Etienne de Martel
@sinba - SomeClass* example[100]; 并不会为您创建一个对象向量。它只是分配了一个可以容纳指向 SomeClass 的指针(100)的数组。要创建一个对象,您应该使用 newalloc/init - Mahesh
为什么Rudy将[C++]标签替换为[C]?他从问题中看到了我错过的东西吗? - Mooing Duck
谈论一个身份危机的问题!它被标记为Obj-C和C,但大多数答案都是用C++编写的。 - Praetorian
非常感谢大家的回复。标记为[obj-c],因为我们使用这种语言。对于C++,我对std::vector<>有一些了解,但不知道如何分配动态数量的对象。 - Sinba
显示剩余5条评论
4个回答

3

首先,这些不是向量对象,它们是编译时数组。编译时数组的一个特性是自动内存管理;也就是说,你不用担心这些数组的分配和释放。

如果你想创建一个大小在运行时才知道的数组,你需要使用 new[]delete[]

int size = somenumber;
int* arr = new int[size];

// use arr
arr[0] = 4;

// print the first value of arr which is 4
cout << arr[0];

关键是,当你完成这个数组后,你需要释放它:

delete[] arr;

如果你忘记使用相应的delete1删除由new创建的东西,就会造成内存泄漏。但是,最好使用std::vector,因为它可以自动管理内存。
// include the header
#include <vector>

using namespace std; // so we don't have std:: everywhere

vector<int> vec; // create a vector for ints
vec.push_back(4); // add some data
vec.push_back(5);
vec.push_back(6);

// vec now holds 4, 5, and 6

cout << vec[0]; // print the first element of vec which is 4

// we can add as many elements to vec as we want without having to use any
// deallocation functions on it like delete[] or anything
// when vec goes out of scope, it will clean up after itself and you won't have any leaks

1请确保使用delete来释放使用new创建的指针,使用delete[]来释放使用new[x]创建的指针。不要混用。同样地,如果您使用std::vector,这个问题就不需要担心了。


谢谢,Seth Carnegie。"std::vector" 是最好的选择。 - Sinba
Seth,我已经检查过了。投票需要15个声望值。 - Sinba

2
为什么不直接使用std::vector?
//file.mm
#include <vector>
-(void)function
{
std::vector<int> count;
std::vector<SomeClass*> example;
count.push_back(10); // add 10 to the array;
count.resize(20); // make count hold 20 objects
count[10] = 5; //set object at index of 10 to the value of 5
}

1

然后你可以这样做:

SomeClass **example = calloc(numClasses, sizeof(SomeClass *));

或者:

int *count = malloc(num_of_counts * sizeof(int));

请注意以下事项:
#include <stdlib.h>

你决定将标签从C++修改为C,是因为你想用C来回答吗? - Praetorian
不,仅仅因为Objective-C(他提到的语言)不是C++,而是C的超集。我认为他选择了错误的标签。 - Rudy Velthuis

1
C++无法创建可变大小的全局/局部数组,只能在堆上创建动态数组。
int main() {
    int variable = 100;
    SomeClass* example = new SomeClass[variable];
    //do stuff 
    delete [] example;  //DO NOT FORGET THIS.  Better yet, use a std::vector
    return 0;
}

我对Objective-C一无所知,但你的问题可能只是其中之一。


或者 std::vector<SomeClass> my_vector(variable);,这样我们就可以完全忘记内存管理了。 :) - Dawson
这就解释了为什么我想不起来针对数组的智能指针。虽然我怎么会忘记向量呢,这超出了我的理解。可能是该吃晚饭了。 - Mooing Duck
谢谢,Mooing Duck!我不知道这个。 - Sinba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接