JeffR
JeffR

Reputation: 805

How to clear uninitialized memory in C++?

I have an incoming unitialized string. I want to remove all the uninitialized memory characters after "Keep" (Keep췍췍췍췍췍췍). Here is my code:

#include <windows.h>
#include <conio.h>

int main()
{
WCHAR* sNew = new WCHAR[10];
sNew[0] = 'K';
sNew[1] = 'e';
sNew[2] = 'e';
sNew[3] = 'p';

_getch();
}

How do I achieve this? In this example, I know the length I want to keep is the first four elements of the array, BUT, I need to code it for varying lengths.

I read that the '췍' symbol is the default for Visual Studio in Debug mode, so in release mode it could be

Upvotes: 1

Views: 489

Answers (4)

Alan
Alan

Reputation: 1

Method 1

You can use std::fill as shown below:

WCHAR* sNew = new WCHAR[10];
std::fill(sNew, sNew + 10, 'a'); //i have used `a` as an example you can chose some other character according to your needs/preference

Or if you want to set characters after Keep in your example you could do:

WCHAR* sNew = new WCHAR[10];
sNew[0] = 'K';
sNew[1] = 'e';
sNew[2] = 'e';
sNew[3] = 'p';

std::fill(sNew + 4, sNew + 10, 'a'); //note the + 4 used here

Method 2

Also do note that you can value initialize all the elements of the array as shown below:

WCHAR* sNew = new WCHAR[10](); //note the empty pair of parenthesis

Upvotes: 1

Loki Astari
Loki Astari

Reputation: 264749

You can initialize all members of the array like this:

#include <windows.h>
#include <conio.h>

int main()
{
    WCHAR* sNew = new WCHAR[10]{0};  // Set all members to zero.

    WCHAR  aNew[10]{0};              // Set all members to zero.

}

Upvotes: 1

Bill Lynch
Bill Lynch

Reputation: 82026

You can zero out the entire memory with memset:

WCHAR* sNew = new WCHAR[10];
memset(sNew, 0, 10*sizeof(WCHAR));

If you're using this memory as a c-string, then you really just need to terminate the string with a null character.

WCHAR* sNew = new WCHAR[10];
sNew[0] = 'K';
sNew[1] = 'e';
sNew[2] = 'e';
sNew[3] = 'p';
sNew[4] = '\0';

Upvotes: 1

ti7
ti7

Reputation: 18930

Practically, I'd suggest a few things

  • don't use C-style arrays like this and prefer the string type, letting the compiler optimize it (const for fixed strings)
    std::string const foo = "bar";
    
  • generally don't manufacture uninitialized memory where possible (for example, consider a vector which will manage the allocation state for you)

Upvotes: 0

Related Questions