C++ 中的动态数组 - 条件跳转或移动取决于未初始化的值
dynamic array in C++ - Conditional jump or move depends on uninitialised value(s)
我有这个代码:
#include <iostream>
using namespace std;
int main()
{
int tmp = 5;
int * arr = new int[tmp];
for(int i = 0; i < 7; i++)
{
if (i == tmp) //if count of values is equal to max size of arr then create new arr with more space
{
int * s = new int[tmp]; // reserve memory
for(int i = 0; i < (tmp); i++)
{
s[i] = arr[i]; //fill reserve memory with values from array arr
}
delete [] arr; // delete arr array
tmp *= 2; //twice more space for array
arr = new int[tmp]; //create new arr with twice more space
for (int i = 0; i < (tmp / 2); i++)
{
arr[i] = s[i]; // add values from old short arr to new arr with more space
}
delete [] s; // delete reserve memory
}
arr[i] = 1; //add 1 to position i in array
}
//show array
for (int j = 0; j < tmp; j++)
cout << arr[j] << " ";
cout << endl;
delete [] arr; //delete arr
return 0;
}
而且我不明白来自 valgrind 的这个错误:
==2664==
==2664== Conditional jump or move depends on uninitialised value(s)
==2664== at 0x4EBFCDE: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4EC02BC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4ECC06D: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x400AE1: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664== Uninitialised value was created by a heap allocation
==2664== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2664== by 0x400A2D: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664==
==2664== Use of uninitialised value of size 8
==2664== at 0x4EBFBC3: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4EBFD05: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4EC02BC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4ECC06D: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x400AE1: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664== Uninitialised value was created by a heap allocation
==2664== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2664== by 0x400A2D: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664==
==2664== Conditional jump or move depends on uninitialised value(s)
==2664== at 0x4EBFBCF: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4EBFD05: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4EC02BC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4ECC06D: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x400AE1: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664== Uninitialised value was created by a heap allocation
==2664== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2664== by 0x400A2D: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664==
==2664== Conditional jump or move depends on uninitialised value(s)
==2664== at 0x4EBFD33: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4EC02BC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4ECC06D: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x400AE1: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664== Uninitialised value was created by a heap allocation
==2664== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2664== by 0x400A2D: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664==
1 1 1 1 1 1 1 0 0 0
==2664==
==2664== HEAP SUMMARY:
==2664== in use at exit: 0 bytes in 0 blocks
==2664== total heap usage: 3 allocs, 3 frees, 80 bytes allocated
==2664==
==2664== All heap blocks were freed -- no leaks are possible
==2664==
==2664== For counts of detected and suppressed errors, rerun with: -v
==2664== ERROR SUMMARY: 12 errors from 4 contexts (suppressed: 0 from 0)
我发现如果我运行这个周期
for(int i = 0; i < 7; i++)
{
到10不仅到7,valgrind不显示任何错误。
我想问你,如果我的想法让数组中的某些位置为空,是不是错了?我不知道我的代码是否适合创建数组,具体取决于您要添加多少值。它是否存在其他一些方式,如果需要如何创建更大的数组?
我尝试 运行 valgrind 与 --track-origins=yes 但找不到答案。
我是 C++ 的新手,所以我对每一个新想法或提示都很高兴。
谢谢你的时间。
一旦这个数组增长到五个 int
,显示的代码将它增长到十个元素,并继续向数组添加两个额外的 int
s,#5 和 #6(我我正在使用基于 0 的索引来引用数组中的单个 int
。
末尾的 for 循环将尝试打印数组的所有 10 个值。包括未初始化的值,#7 到#9。这就是 valgrind 告诉你的。
valgrind 的诊断几乎无法破译,因为在您深入 I/O 库的内部之前,未初始化的内存使用实际上不会发生。该错误在 main()
函数中,但它所做的只是将对未初始化值的引用传递给 I/O 库。在 I/O 库中实际抓取未初始化的值以进行格式化之前,这不会触发未定义的行为。
P.S.:首先通过将数组的内容复制到新的s
数组来增长数组。原始 arr
被删除并被新的 10 元素 arr
替换,然后五个值从 s
复制回来,s
被删除。
这是很多不必要的复制。分配新的10元数组就可以了,把已有的内容复制进去,然后删除原来的,用新的数组替换。
您的问题已经得到解答,但下次要知道,如果您在 g++
中使用 -g3
标志编译代码,valgrind 也会向您显示出现问题的行号。例如,使用 g++ teste.cpp -g3
和 valgrind --track-origins=yes ./a.out
编译将得到:
==20609== Memcheck, a memory error detector
==20609== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==20609== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==20609== Command: ./a.out
==20609==
==20609== Conditional jump or move depends on uninitialised value(s)
==20609== at 0x4F3CCAE: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F3CEDC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F493F9: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x400AE0: main (teste.cpp:31)
==20609== Uninitialised value was created by a heap allocation
==20609== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20609== by 0x400A2B: main (teste.cpp:20)
==20609==
==20609== Use of uninitialised value of size 8
==20609== at 0x4F3BB13: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F3CCD9: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F3CEDC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F493F9: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x400AE0: main (teste.cpp:31)
==20609== Uninitialised value was created by a heap allocation
==20609== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20609== by 0x400A2B: main (teste.cpp:20)
==20609==
==20609== Conditional jump or move depends on uninitialised value(s)
==20609== at 0x4F3BB1F: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F3CCD9: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F3CEDC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F493F9: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x400AE0: main (teste.cpp:31)
==20609== Uninitialised value was created by a heap allocation
==20609== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20609== by 0x400A2B: main (teste.cpp:20)
==20609==
==20609== Conditional jump or move depends on uninitialised value(s)
==20609== at 0x4F3CD0C: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F3CEDC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F493F9: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x400AE0: main (teste.cpp:31)
==20609== Uninitialised value was created by a heap allocation
==20609== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20609== by 0x400A2B: main (teste.cpp:20)
==20609==
1 1 1 1 1 1 1 0 0 0
==20609==
==20609== HEAP SUMMARY:
==20609== in use at exit: 72,704 bytes in 1 blocks
==20609== total heap usage: 5 allocs, 4 frees, 73,808 bytes allocated
==20609==
==20609== LEAK SUMMARY:
==20609== definitely lost: 0 bytes in 0 blocks
==20609== indirectly lost: 0 bytes in 0 blocks
==20609== possibly lost: 0 bytes in 0 blocks
==20609== still reachable: 72,704 bytes in 1 blocks
==20609== suppressed: 0 bytes in 0 blocks
==20609== Rerun with --leak-check=full to see details of leaked memory
==20609==
==20609== For counts of detected and suppressed errors, rerun with: -v
==20609== ERROR SUMMARY: 12 errors from 4 contexts (suppressed: 0 from 0)
这告诉您第 31 行中使用的未初始化值,它们是由第 20 行中的新创建的。
这可能很有帮助。
我有这个代码:
#include <iostream>
using namespace std;
int main()
{
int tmp = 5;
int * arr = new int[tmp];
for(int i = 0; i < 7; i++)
{
if (i == tmp) //if count of values is equal to max size of arr then create new arr with more space
{
int * s = new int[tmp]; // reserve memory
for(int i = 0; i < (tmp); i++)
{
s[i] = arr[i]; //fill reserve memory with values from array arr
}
delete [] arr; // delete arr array
tmp *= 2; //twice more space for array
arr = new int[tmp]; //create new arr with twice more space
for (int i = 0; i < (tmp / 2); i++)
{
arr[i] = s[i]; // add values from old short arr to new arr with more space
}
delete [] s; // delete reserve memory
}
arr[i] = 1; //add 1 to position i in array
}
//show array
for (int j = 0; j < tmp; j++)
cout << arr[j] << " ";
cout << endl;
delete [] arr; //delete arr
return 0;
}
而且我不明白来自 valgrind 的这个错误:
==2664==
==2664== Conditional jump or move depends on uninitialised value(s)
==2664== at 0x4EBFCDE: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4EC02BC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4ECC06D: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x400AE1: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664== Uninitialised value was created by a heap allocation
==2664== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2664== by 0x400A2D: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664==
==2664== Use of uninitialised value of size 8
==2664== at 0x4EBFBC3: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4EBFD05: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4EC02BC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4ECC06D: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x400AE1: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664== Uninitialised value was created by a heap allocation
==2664== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2664== by 0x400A2D: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664==
==2664== Conditional jump or move depends on uninitialised value(s)
==2664== at 0x4EBFBCF: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4EBFD05: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4EC02BC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4ECC06D: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x400AE1: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664== Uninitialised value was created by a heap allocation
==2664== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2664== by 0x400A2D: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664==
==2664== Conditional jump or move depends on uninitialised value(s)
==2664== at 0x4EBFD33: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4EC02BC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x4ECC06D: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==2664== by 0x400AE1: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664== Uninitialised value was created by a heap allocation
==2664== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2664== by 0x400A2D: main (in /home/vojta/Dokumenty/C++/vstup do pole/a.out)
==2664==
1 1 1 1 1 1 1 0 0 0
==2664==
==2664== HEAP SUMMARY:
==2664== in use at exit: 0 bytes in 0 blocks
==2664== total heap usage: 3 allocs, 3 frees, 80 bytes allocated
==2664==
==2664== All heap blocks were freed -- no leaks are possible
==2664==
==2664== For counts of detected and suppressed errors, rerun with: -v
==2664== ERROR SUMMARY: 12 errors from 4 contexts (suppressed: 0 from 0)
我发现如果我运行这个周期
for(int i = 0; i < 7; i++)
{
到10不仅到7,valgrind不显示任何错误。 我想问你,如果我的想法让数组中的某些位置为空,是不是错了?我不知道我的代码是否适合创建数组,具体取决于您要添加多少值。它是否存在其他一些方式,如果需要如何创建更大的数组?
我尝试 运行 valgrind 与 --track-origins=yes 但找不到答案。
我是 C++ 的新手,所以我对每一个新想法或提示都很高兴。 谢谢你的时间。
一旦这个数组增长到五个 int
,显示的代码将它增长到十个元素,并继续向数组添加两个额外的 int
s,#5 和 #6(我我正在使用基于 0 的索引来引用数组中的单个 int
。
末尾的 for 循环将尝试打印数组的所有 10 个值。包括未初始化的值,#7 到#9。这就是 valgrind 告诉你的。
valgrind 的诊断几乎无法破译,因为在您深入 I/O 库的内部之前,未初始化的内存使用实际上不会发生。该错误在 main()
函数中,但它所做的只是将对未初始化值的引用传递给 I/O 库。在 I/O 库中实际抓取未初始化的值以进行格式化之前,这不会触发未定义的行为。
P.S.:首先通过将数组的内容复制到新的s
数组来增长数组。原始 arr
被删除并被新的 10 元素 arr
替换,然后五个值从 s
复制回来,s
被删除。
这是很多不必要的复制。分配新的10元数组就可以了,把已有的内容复制进去,然后删除原来的,用新的数组替换。
您的问题已经得到解答,但下次要知道,如果您在 g++
中使用 -g3
标志编译代码,valgrind 也会向您显示出现问题的行号。例如,使用 g++ teste.cpp -g3
和 valgrind --track-origins=yes ./a.out
编译将得到:
==20609== Memcheck, a memory error detector
==20609== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==20609== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==20609== Command: ./a.out
==20609==
==20609== Conditional jump or move depends on uninitialised value(s)
==20609== at 0x4F3CCAE: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F3CEDC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F493F9: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x400AE0: main (teste.cpp:31)
==20609== Uninitialised value was created by a heap allocation
==20609== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20609== by 0x400A2B: main (teste.cpp:20)
==20609==
==20609== Use of uninitialised value of size 8
==20609== at 0x4F3BB13: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F3CCD9: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F3CEDC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F493F9: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x400AE0: main (teste.cpp:31)
==20609== Uninitialised value was created by a heap allocation
==20609== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20609== by 0x400A2B: main (teste.cpp:20)
==20609==
==20609== Conditional jump or move depends on uninitialised value(s)
==20609== at 0x4F3BB1F: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F3CCD9: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F3CEDC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F493F9: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x400AE0: main (teste.cpp:31)
==20609== Uninitialised value was created by a heap allocation
==20609== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20609== by 0x400A2B: main (teste.cpp:20)
==20609==
==20609== Conditional jump or move depends on uninitialised value(s)
==20609== at 0x4F3CD0C: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_int<long>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F3CEDC: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, long) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x4F493F9: std::ostream& std::ostream::_M_insert<long>(long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==20609== by 0x400AE0: main (teste.cpp:31)
==20609== Uninitialised value was created by a heap allocation
==20609== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20609== by 0x400A2B: main (teste.cpp:20)
==20609==
1 1 1 1 1 1 1 0 0 0
==20609==
==20609== HEAP SUMMARY:
==20609== in use at exit: 72,704 bytes in 1 blocks
==20609== total heap usage: 5 allocs, 4 frees, 73,808 bytes allocated
==20609==
==20609== LEAK SUMMARY:
==20609== definitely lost: 0 bytes in 0 blocks
==20609== indirectly lost: 0 bytes in 0 blocks
==20609== possibly lost: 0 bytes in 0 blocks
==20609== still reachable: 72,704 bytes in 1 blocks
==20609== suppressed: 0 bytes in 0 blocks
==20609== Rerun with --leak-check=full to see details of leaked memory
==20609==
==20609== For counts of detected and suppressed errors, rerun with: -v
==20609== ERROR SUMMARY: 12 errors from 4 contexts (suppressed: 0 from 0)
这告诉您第 31 行中使用的未初始化值,它们是由第 20 行中的新创建的。
这可能很有帮助。