I want to initialize array of c-strings with zero pointers in 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 hav开发者_如何学运维e to initialize arr_ (dynamic array and can be enlarged later)
arr_ = (char **)calloc(INITIAL_SZ * sizeof (char *)); // ???
// or maybe arr_ = new ...
}
How to correct initialize arr_
? I was not allowed to use of STL, MFC, etc.
arr = new char*[INITIAL_SZ]();
will do - you can even put it in an initialization list.
If you really want to avoid STL, etc., then why not:
arr_ = new char*[INITIAL_SZ]();
You could even put this in the initializer list.
Remember to invoke delete [] arr_
in your destructor. (As @Nawaz points out below, you should probably also follow the Rule of Three, and define a suitable copy-constructor and assignment operator as well.)
1. Build a proper string class
2. Build a proper array class
3. Use the array on strings
Happy chasing memory leaks, double frees and memory corruption.
arr_ = (char **)calloc(INITIAL_SZ * sizeof (char *));
should be
arr_ = (char **)calloc(INITIAL_SZ, sizeof (char *));
The correct way is to redefine arr_
as std::vector<std::string>
and to use vector::reserve()
to hint at the number of strings you expect to have. Let C++ take care of the memory for you.
But if you must use raw C strings, you probably want:
arr_ = new char *[sz_];
精彩评论