gpt4 book ai didi

c++ - 在 C++ 中不使用 new 运算符的内存泄漏

转载 作者:搜寻专家 更新时间:2023-10-31 00:59:26 25 4
gpt4 key购买 nike

<分区>

我目前正在为我的类(class)重新创建一个基本的 linux shell,但即使没有使用 new 运算符,我也遇到了 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

下面是我的部分代码。

#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;
}

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com