Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中未使用新运算符时发生内存泄漏+;_C++_Memory Leaks - Fatal编程技术网

C++ 在C+中未使用新运算符时发生内存泄漏+;

C++ 在C+中未使用新运算符时发生内存泄漏+;,c++,memory-leaks,C++,Memory Leaks,我目前正在为我的类重新创建一个基本的linux shell,我在valgrind检测内存泄漏时遇到了问题,即使没有使用新的操作符。我不知道该看哪里,我也无法从valgrind错误消息中得到任何信息。如果有人知道内存泄漏的来源,我们将不胜感激。谢谢大家! ==26432== ==26432== HEAP SUMMARY: ==26432== in use at exit: 61 bytes in 2 blocks ==26432== total heap usage: 268 all

我目前正在为我的类重新创建一个基本的linux shell,我在valgrind检测内存泄漏时遇到了问题,即使没有使用新的操作符。我不知道该看哪里,我也无法从valgrind错误消息中得到任何信息。如果有人知道内存泄漏的来源,我们将不胜感激。谢谢大家!

==26432== 
==26432== HEAP SUMMARY:
==26432==     in use at exit: 61 bytes in 2 blocks
==26432==   total heap usage: 268 allocs, 266 frees, 28,546 bytes allocated
==26432== 
==26432== 29 bytes in 1 blocks are possibly lost in loss record 1 of 2
==26432==    at 0x4C2B0E0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==26432==    by 0x4EF1208: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x4EF1DCA: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x4EF1E63: std::string::reserve(unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x4EACF5E: std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x401895: main (in /home/randyhe/Documents/FALL2015/CS100/rshell/bin/rshell)
==26432== 
==26432== 32 bytes in 1 blocks are possibly lost in loss record 2 of 2
==26432==    at 0x4C2B0E0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==26432==    by 0x4EF1208: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x4EF2930: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x4EF2D47: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x401826: main (in /home/randyhe/Documents/FALL2015/CS100/rshell/bin/rshell)
==26432== 
==26432== LEAK SUMMARY:
==26432==    definitely lost: 0 bytes in 0 blocks
==26432==    indirectly lost: 0 bytes in 0 blocks
==26432==      possibly lost: 61 bytes in 2 blocks
==26432==    still reachable: 0 bytes in 0 blocks
==26432==         suppressed: 0 bytes in 0 blocks
==26432== 
==26432== For counts of detected and suppressed errors, rerun with: -v
==26432==
==26432==堆摘要:
==26432==在出口处使用:2个块中有61个字节
==26432==总堆使用率:268个allocs,266个free,28546个字节已分配
==26432== 
==26432==1个块中的29个字节可能在丢失记录1(共2个)中丢失
==26432==at 0x4C2B0E0:运算符新(无符号长)(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==26432==by 0x4EF1208:std::string::_Rep::_S_create(无符号长、无符号长、std::分配器常量&)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==by 0x4EF1DCA:std::string::_Rep::_M_clone(std::allocator const&,unsigned long)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==by 0x4EF1E63:std::string::reserve(无符号长)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==by 0x4EACF5E:std::basic_istream&std::getline(std::basic_istream&,std::basic_string&,char)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==by 0x401895:main(in/home/randyhe/Documents/FALL2015/CS100/rshell/bin/rshell)
==26432== 
==26432==1个块中的32个字节可能在丢失记录2(共2个)中丢失
==26432==at 0x4C2B0E0:运算符新(无符号长)(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==26432==by 0x4EF1208:std::string::_Rep::_S_create(无符号长、无符号长、std::分配器常量&)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==by 0x4EF2930:char*std::string::_S_构造(char const*,char const*,std::allocator const&,std::forward_iterator_标记)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==by 0x4EF2D47:std::basic_string::basic_string(char const*,std::allocator const&)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==0x401826:main(in/home/randyhe/Documents/FALL2015/CS100/rshell/bin/rshell)
==26432== 
==26432==泄漏摘要:
==26432==肯定丢失:0个块中有0个字节
==26432==间接丢失:0个块中有0个字节
==26432==可能丢失:2个块中有61个字节
==26432==仍然可访问:0个块中有0个字节
==26432==抑制:0个块中有0个字节
==26432== 
==26432==对于检测到的和抑制的错误计数,请使用:-v重新运行
下面是我代码的一部分

#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#include <sstream>
#include <string>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/wait.h>
#include <errno.h>
#include <limits.h>
#include <pwd.h>

std::pair<std::vector<std::vector<std::string> >, std::queue<std::string> >
    parseInput(std::string s, bool& b);
void check(std::string singleWord, std::string keyword, bool& b, int& index,
        std::vector<std::vector<std::string> >& v, std::queue<std::string>& q);
void executeAll(std::pair<std::vector<std::vector<std::string> >,
    std::queue<std::string> > p);
void printCommands(const std::vector<std::vector<std::string> >& v);
void printConnectors(std::queue<std::string> q);
bool executeSingle(std::vector<std::string>& v);
std::vector<char*> toCharPointers(std::vector<std::string>& v);
char* getHost();

int main()
{
    // Store hostname into character array object hostname
    char hostname[HOST_NAME_MAX];
    int status = gethostname(hostname, HOST_NAME_MAX);
    if(status != 0)
    {
        perror("gethostname failed");
        exit(errno);
    }

    // Store username to login object
    struct passwd *pws;
    pws = getpwuid(geteuid());
    if(pws == NULL)
    {
        perror("getid failed");
        exit(errno);
    }
    std::string login = pws->pw_name;

    for(;;)
    {
        // Output login and hostname
        std::cout << login << "@" << hostname << "$ ";

        // Get user input
        std::string userInput;
        std::getline(std::cin, userInput);

        // If user inputs exit, end program
        if(userInput == "exit")
            exit(0);

        // parsedPair holds the list of commands on its .first, and holds
        // the list of connectors on its .second
        bool correctSyntax = true;
        std::pair<std::vector<std::vector<std::string> >, 
            std::queue<std::string> > parsedPair = 
                parseInput(userInput, correctSyntax);

        if(correctSyntax)
            executeAll(parsedPair);
    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
std::pair
parseInput(标准::字符串s、bool和b);
无效检查(std::string singleWord、std::string关键字、bool&b、int&index、,
std::vector&v,std::queue&q);
void executeAll(std::pair p);
无效打印命令(const std::vector&v);
无效打印连接器(标准::队列q);
bool executeSingle(std::vector&v);
std::矢量指向指针(std::矢量和v);
char*getHost();
int main()
{
//将主机名存储到字符数组对象主机名中
字符主机名[主机名\最大值];
int status=gethostname(主机名、主机名、最大值);
如果(状态!=0)
{
perror(“gethostname失败”);
出口(errno);
}
//将用户名存储到登录对象
结构passwd*pws;
pws=getpwuid(geteuid());
如果(pws==NULL)
{
perror(“getid失败”);
出口(errno);
}
std::string login=pws->pw_name;
对于(;;)
{
//输出登录名和主机名

std::cout如果你知道如何阅读它,你将确切地看到发生了什么:

==26432== HEAP SUMMARY:
==26432==     in use at exit: 61 bytes in 2 blocks
==26432==   total heap usage: 268 allocs, 266 frees, 28,546 bytes allocated
==26432== 
==26432== 29 bytes in 1 blocks are possibly lost in loss record 1 of 2
==26432==    at 0x4C2B0E0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==26432==    by 0x4EF1208: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x4EF1DCA: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x4EF1E63: std::string::reserve(unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x4EACF5E: std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x401895: main (in /home/randyhe/Documents/FALL2015/CS100/rshell/bin/rshell)
==26432== 
==26432== 32 bytes in 1 blocks are possibly lost in loss record 2 of 2
==26432==    at 0x4C2B0E0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==26432==    by 0x4EF1208: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x4EF2930: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x4EF2D47: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==    by 0x401826: main (in /home/randyhe/Documents/FALL2015/CS100/rshell/bin/rshell)
==26432==
==26432==堆摘要:
==26432==在出口处使用:2个块中有61个字节
==26432==总堆使用率:268个allocs,266个free,28546个字节已分配
==26432== 
==26432==1个块中的29个字节可能在丢失记录1(共2个)中丢失
==26432==at 0x4C2B0E0:运算符新(无符号长)(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==26432==by 0x4EF1208:std::string::_Rep::_S_create(无符号长、无符号长、std::分配器常量&)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==by 0x4EF1DCA:std::string::_Rep::_M_clone(std::allocator const&,unsigned long)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==by 0x4EF1E63:std::string::reserve(无符号长)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==by 0x4EACF5E:std::basic_istream&std::getline(std::basic_istream&,std::basic_string&,char)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==by 0x401895:main(in/home/randyhe/Documents/FALL2015/CS100/rshell/bin/rshell)
==26432== 
==26432==1个块中的32个字节可能在丢失记录2(共2个)中丢失
==26432==at 0x4C2B0E0:运算符新(无符号长)(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==26432==by 0x4EF1208:std::string::_Rep::_S_create(无符号长、无符号长、std::分配器常量&)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==by 0x4EF2930:char*std::string::_S_构造(char const*,char const*,std::allocator const&,std::forward_iterator_标记)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==by 0x4EF2D47:std::basic_string::basic_string(char const*,std::allocator const&)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==0x401826:main(in/home/randyhe/Documents/FALL2015/CS100/rshell/bin/rshell)
==26432==
这:

==26432==by 0x4EACF5E:std::basic_istream&std::getline(std::basic_istream&,std::basic_string&,char)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
这是:

==26432==    by 0x4EF2D47: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==26432==by 0x4EF2D47:std::basic_string::basic_string(char const*,std::allocator const&)(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
这是构造吗
==26432==    by 0x4EF2D47: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)