DaveUK
DaveUK

Reputation: 1580

C++ Creating a simple array of LPWSTR's

As a C++ noob, I can't seem to get this right even though I know it should be simple :{ - I need to create an array of LPWSTR and then populate it with unique strings. The idea was to do something simple like this:

LPWSTR *wszArray = new LPWSTR[5];

for(int x = 0; x < 5; x++)
{
    swprintf(wszArray[x], "somestring_%d", x);
}

I know that I haven't allocated memory for the LPWSTR, but after trying a few things I am not having much luck. Also I'm not sure if the array should be free'd later once i'm done with the strings.

Any advice would be great.

Upvotes: 2

Views: 10871

Answers (5)

Jerry Coffin
Jerry Coffin

Reputation: 490808

What you have right now is a single pointer to pointers to wide char. You're then initializing that with the address of an array of 5 dynamically allocated pointers to wide char's. That's fine as far as it goes, but does not allocate any space for the strings themselves, only for pointers to 5 strings. You then need to allocate space for the strings themselves:

for (int i=0; i<5; i++) {
    array[i] = new char[13];
    swprintf(array[i], L"somestring_%d", i);
}

Yes, you should delete the space you allocated after you're done using it. That would look something like:

for (int i=0; i<5; i++)
    delete [] array[i];
delete [] array;

OTOH, you probably shouldn't do any of this, and instead use something like:

std::vector<std::wstring> array;

for (int i=0; i<5; i++) {
     std::wostringstream temp;
     temp << L"somestring_" << i;
     array.push_back(temp.str());
}

In this case, you can retrieve a "LPWSTR" using array[i].c_str(). You don't have to allocate or free any of the memory explicitly at all though.

Upvotes: 3

Marc
Marc

Reputation: 53

I am actually also new in C++ (only finish Deitel c++ book, nothing more), I like CString only :-( if I agree to allow the project to accept MFC library in the project settings, I include the whole library in the header file if I feel like to, then I can do something like

CString str="";
CArray<CString,CString> arr;
for(int i=0;i<n;i++)
{ 
   str.Format("something_%d",i);
   arr.Add(str);
} 

If you really really love LPWSTR, the above also works with it. CString is a class designed to handle ANSi and Unixcode... :-)

Upvotes: 0

Ajay
Ajay

Reputation: 18461

Learning and doing some research-and-development is different aspect. But you shoulnt use these native methods for string processing. Instead use classes like std::string, stringstream, CString etc.

  • std::string is used by many (NOT by me!), it doesn't support << operator, nor formatting functions, but supports other functions.
  • stringstream is rich, doesn't support formatting functions, but << operators, which are resolved at compile time and are type-safe.
  • CString supports formatting functions, and other common string functionality. It doesn't support << operator. It handles ANSI/Unicode issues quite well. If you arent using MFC, you still can use it by #include<atlstr.h> in non-MFC project.

Upvotes: 0

A. K.
A. K.

Reputation: 38260

actually LPWSTR is already a pointer you should rather do

LPTSTR pBuffer; // TCHAR* 
pBuffer = new TCHAR[128]; // Allocates 128 or 256 BYTES, depending on compilation.

and then the for loop will be fine. for unicode-long string you need to prefix the string with L like in L"your string"

and later you need to free the memory allocated using delete[]

like :

delete[] pBuffer;

for further documentation you may like to read:

http://www.codeproject.com/Tips/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc

Upvotes: 2

Chris
Chris

Reputation: 11

LPWSTR is a unicode long string pointer in MS Windows, try using strings with the L"" form such as:

swprintf(wszArray[x], L"somestring_%d", x);

Unicode macros in Windows are available by using #define UNICODE, in MS VS there is a setting to use unicode strings, when set, it will define UNICODE for you.

LPWSTR is the same as wchar_t* and LPSTR is char*.

When allocate memory in c++, it should always be free'd, so the answer is Yes.

Upvotes: 1

Related Questions