Как инициализировать массив c-strings (без stl) - PullRequest
0 голосов
/ 26 мая 2011

Я хочу инициализировать массив c-строк с нулевыми указателями в MSVC2010

// Foo.h
#pragma once
class Foo {
  int sz_;
  char **arr_; 
public:
  Foo();
  ~Foo();
  // ... some other functions
};

// Foo.cpp
#include "Foo.h"
#define INITIAL_SZ 20

Foo::Foo() : sz_(INITIAL_SZ) {
  // there I have to initialize arr_ (dynamic array and can be enlarged later)
  arr_ = (char **)calloc(INITIAL_SZ * sizeof (char *)); // ??? 
  // or maybe arr_ = new ...
}

Как исправить инициализацию arr_?Мне не разрешили использовать STL, MFC и т. Д.

Ответы [ 5 ]

5 голосов
/ 26 мая 2011

arr = new char*[INITIAL_SZ](); подойдет - вы даже можете поместить его в список инициализации.

4 голосов
/ 26 мая 2011

Если вы действительно хотите избежать STL и т. Д., То почему бы и нет:

arr_ = new char*[INITIAL_SZ]();

Вы даже можете поместить это в список инициализатора.

Не забудьте вызвать delete [] arr_ в вашем деструкторе. (Как указывает @Nawaz ниже, вам, вероятно, следует также следовать правилу трех и определить подходящий конструктор копирования и оператор присваивания.)

2 голосов
/ 26 мая 2011

1.Создайте правильный класс строки

2.Создайте правильный класс массива

3.Использовать массив в строках

Счастливая погоня за утечками памяти, двойным освобождением и повреждением памяти.

1 голос
/ 26 мая 2011

Правильный способ - переопределить arr_ как std::vector<std::string> и использовать vector::reserve(), чтобы намекнуть на количество ожидаемых строк. Пусть C ++ позаботится о памяти для вас.

Но если вы должны использовать необработанные строки C, вы, вероятно, захотите:

arr_ = new char *[sz_];
1 голос
/ 26 мая 2011
arr_ = (char **)calloc(INITIAL_SZ * sizeof (char *));

должно быть

arr_ = (char **)calloc(INITIAL_SZ, sizeof (char *));

...