Динамическое выделение массива (динамический размер векторной реализации) - PullRequest
3 голосов
/ 26 августа 2011

В объекте obj-c мы можем создавать векторные объекты следующим образом:

SomeClass* example[100];

или

int count[7000];

Но что, если мы знаем размер вектора только в то времяначать класс?(Может быть, нам нужен пример [756] или count [15])

Ответы [ 4 ]

3 голосов
/ 26 августа 2011

Прежде всего, это не векторные объекты, это массивы времени компиляции. Одной из особенностей массивов времени компиляции является автоматическое управление памятью; то есть вам не нужно беспокоиться о распределении и освобождении этих массивов.

Если вы хотите создать массив, размер которого вы не знаете до времени выполнения, вам нужно использовать 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;

Если вы забудете , чтобы освободить что-то, созданное new с соответствующим delete 1 , вы создадите утечка памяти .

Возможно, вам лучше использовать 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, вам не нужно об этом беспокоиться.

2 голосов
/ 26 августа 2011

Почему бы просто не использовать 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 голос
/ 26 августа 2011

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;
}

Я ничего не знаю о target-C, но ваш вопрос, вероятно, только один илидругой.

1 голос
/ 26 августа 2011

Затем вы делаете что-то вроде:

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

или

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

Обратите внимание, что вы должны:

#include <stdlib.h>
...