Рассмотрим следующий кодуказатели, указывающие непрерывной памяти
struct foo
{
const int txt_len;
const int num_len;
char * txt;
int * num;
foo(int tl, int nl): txt_len(tl), num_len(nl)
{
char * tmp = new char[txt_len * sizeof(char) + num_len * sizeof(int)];
txt = new (tmp) char [txt_len * sizeof(char)];
num = new (tmp + txt_len * sizeof(char)) int[num_len * sizeof(int)];
// is this the same as above?
// txt = tmp;
// num = (int *) (tmp + txt_len * sizeof(char));
}
~foo()
{
delete[] txt; // is this the right way to free the memory?
}
};
Я хочу, *txt
и *num
быть смежными, является то, что лучший способ сделать это?
также есть разница между размещением нового и арифметикой указателя? который я должен использовать?
Я понятия не имел, что вы можете использовать новый на существующей памяти таким образом. +1 для вас. – rsaxvc
Трудно дать вам полезный ответ, не понимая, почему вам нужна непрерывная память. Это действительно зависит от того, что вы планируете с ним делать. (Например, планируете ли вы использовать указатели разыменования? Если да, то какого типа? Вы хотите, чтобы промежуток имел нормальную структуру? Или вы хотите, чтобы он упакован?) Ваш код выше незаконный, вы не можете пройти размещение новых указатель, который не выровнен. –
Сначала введите 'int', так как он имеет более строгие требования к выравниванию. И 'sizeof (char)' гарантированно будет точно '1'. –