Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Default Array Initialization Bug

18 views
Skip to first unread message

Marcus Kwok

unread,
Mar 23, 2006, 9:08:22 PM3/23/06
to
I found a bug in VC++ .NET 2003 regarding default initialization of
arrays of primitives in a constructor initialization list, as detailed
in this post:
http://groups.google.com/group/comp.lang.c++/msg/dab44a8b786b6a79

and in the reply by Dietmar Kuehl, in which he quotes the relevant
portion of the C++ Standard:
http://groups.google.com/group/comp.lang.c++/msg/71a9fecc4f5d7d57

I tried to file a bug report at
http://lab.msdn.microsoft.com/productfeedback/default.aspx
but they only let you submit bug reports for VC++ 2005, which I am
unable to install at the moment, and I am not sure if the bug is present
in the newer version.

Can anybody confirm if this bug is present in the newer version?

--
Marcus Kwok

Bruno van Dooren

unread,
Mar 24, 2006, 1:53:24 AM3/24/06
to


This is the output when compiled with VC2005

During compilation:
warning C4351: new behavior: elements of array 'Init::ai' will be default
initialized
warning C4351: new behavior: elements of array 'Init::bi' will be default
initialized

When running

UnInit:
ai = {-858993460, -858993460, -858993460, -858993460, }
bi = {204, 204, 204, 204, }

Init:
ai = {0, 0, 0, 0, }
bi = {0, 0, 0, 0, }


--

Kind regards,
Bruno van Dooren
bruno_nos_pa...@hotmail.com
Remove only "_nos_pam"


Marcus Kwok

unread,
Mar 24, 2006, 1:24:05 PM3/24/06
to
Bruno van Dooren <bruno_nos_pa...@hotmail.com> wrote:
>>I found a bug in VC++ .NET 2003 regarding default initialization of
>> arrays of primitives in a constructor initialization list, as detailed
>> in this post:
>> http://groups.google.com/group/comp.lang.c++/msg/dab44a8b786b6a79
>>
>> and in the reply by Dietmar Kuehl, in which he quotes the relevant
>> portion of the C++ Standard:
>> http://groups.google.com/group/comp.lang.c++/msg/71a9fecc4f5d7d57
>>
>> I tried to file a bug report at
>> http://lab.msdn.microsoft.com/productfeedback/default.aspx
>> but they only let you submit bug reports for VC++ 2005, which I am
>> unable to install at the moment, and I am not sure if the bug is present
>> in the newer version.
>>
>> Can anybody confirm if this bug is present in the newer version?
>
> This is the output when compiled with VC2005
>
> During compilation:
> warning C4351: new behavior: elements of array 'Init::ai' will be default
> initialized
> warning C4351: new behavior: elements of array 'Init::bi' will be default
> initialized
>
> When running
>
> UnInit:
> ai = {-858993460, -858993460, -858993460, -858993460, ^H^H}
> bi = {204, 204, 204, 204, ^H^H}
>
> Init:
> ai = {0, 0, 0, 0, ^H^H}
> bi = {0, 0, 0, 0, ^H^H}

I see, so they fixed it in the new version. Thanks for checking this
for me, and I will not file a bug report.

--
Marcus Kwok

Patrick Kowalzick

unread,
Mar 30, 2006, 1:46:25 AM3/30/06
to
>I found a bug in VC++ .NET 2003 regarding default initialization of
> arrays of primitives in a constructor initialization list, as detailed
> in this post:
> http://groups.google.com/group/comp.lang.c++/msg/dab44a8b786b6a79
>
> and in the reply by Dietmar Kuehl, in which he quotes the relevant
> portion of the C++ Standard:
> http://groups.google.com/group/comp.lang.c++/msg/71a9fecc4f5d7d57

Funny enough the following change works as expected:

struct Init_POD
{
int ai[Size];
bool bi[Size];
};

class Init {
Init_POD pods;
public:
Init() : pods() { }
friend std::ostream& operator<<(std::ostream& o, const Init& i);
};

std::ostream&
operator<<(std::ostream& o, const Init& in)
{
o << "Init:\n";
o << "ai = {";
std::copy(in.pods.ai, in.pods.ai + Size, std::ostream_iterator<int>(o,
", "));
o << "\b\b}\n";

o << "bi = {";
std::copy(in.pods.bi, in.pods.bi + Size, std::ostream_iterator<bool>(o,
", "));
o << "\b\b}";

return o;
}

Regards,
Patrick


Marcus Kwok

unread,
Mar 30, 2006, 10:34:56 AM3/30/06
to
Patrick Kowalzick <patrick....@mapandguide.de> wrote:
>>I found a bug in VC++ .NET 2003 regarding default initialization of
>> arrays of primitives in a constructor initialization list, as detailed
>> in this post:
>> http://groups.google.com/group/comp.lang.c++/msg/dab44a8b786b6a79
>>
>> and in the reply by Dietmar Kuehl, in which he quotes the relevant
>> portion of the C++ Standard:
>> http://groups.google.com/group/comp.lang.c++/msg/71a9fecc4f5d7d57
>
> Funny enough the following change works as expected:
>
> struct Init_POD
> {
> int ai[Size];
> bool bi[Size];
> };
>
> class Init {
> Init_POD pods;
> public:
> Init() : pods() { }
> friend std::ostream& operator<<(std::ostream& o, const Init& i);
> };

Hmm, that is interesting! Thanks.

--
Marcus Kwok

0 new messages