Утечка памяти в string.replace
Здравствуйте!
В программе утекает память, запустил через valgrind и никак не могу понять: пишет possible lost в следующей функции на строчке 'return FALSE':
ReplaceStr(string& str, const string& from, const string& to)
{
size_t start_pos = str.find(from);
if(start_pos == std::string::npos)
return FALSE;
str.replace(start_pos, from.length(), to);
return TRUE;
}
Помогите разобраться, пожалуйста, уже всю голову сломал. Что делаю не так?
UPDATE
int CameraType::MakeSourceUrls()
{
string tmp_str;
BaseUrlArray *BaseUrls;
BaseUrls = new BaseUrlArray;
GetCamTypeFromXml(CamRecParam->ModelName, BaseUrls);
for (int i = PIPE_MJPEG; i <= PIPE_H264; i++)
{
if (BaseUrls->Urls[i].murl.length() < 14)
{
sprintf(str, "ERROR: Base URL for camera '%s' for type = %d is not valid\n", CamRecParam->Name.c_str(), i);
AppendLog(str, "CameraType::MakeSourceUrls", ERROR);
CamRecParam->UrlVidFormat[i].url = "";
continue;
}
tmp_str = BaseUrls->Urls[i].murl;
ReplaceStr(tmp_str, "IPADDRESS", CamRecParam->IP);
CamRecParam->IP это обычный string
UPDATE#2
Для приведенного ниже кода valgrind выдает 0 ошибок. Тип auto заменил на size_type, т.к. у меня нет поддержки auto на данной платформе.
#include <iostream>
#include <string>
using namespace std;
bool ReplaceStr(string& str, const string& from, const string& to)
{
std::string::size_type start_pos = str.find(from);
if(start_pos == std::string::npos)
return false;
str.replace(start_pos, from.length(), to);
return true;
}
int main()
{
string haystack = "Soft cat, warm cat, little ball of fur";
string needle = "cat";
string replacement = "kitty";
ReplaceStr(haystack, needle, replacement);
ReplaceStr(haystack, needle, replacement);
cout << haystack;
return 0;
}
UPDATE#3
Полный лог valgrind: http://pastebin.com/UNbR1Jzr
UPDATE#4
CamRecParam это просто класс-оболочка свойств камеры (тип, IP-адрес и прочие параметры). Является переменной класса CameraType. Создается при инициализации экземпляра класса CameraType. MakeSourceUrls читает конфигурационный файл xml и заносит полученные параметры камеры в соответствующие поля CamRecParam. Все это выполняется из основного потока программы. У класса CameraType есть также переменная-экземпляр класса Writer, который отвечает за подключение к камере и запись потока на диск. Вот собственно цикл записи этого Writer и выполняется в отдельном потоке. Да, он берет какие-то поля из CamRecParam, но только читает их...
UPDATE#5
Модифицировал тестовую программу и получил те же ошибки valgrind! Интрига накаляется...
Программа:
#include <iostream>
#include <string>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/time.h>
#include <stdlib.h>
using namespace std;
bool ReplaceStr(string& str, const string& from, const string& to)
{
std::string::size_type start_pos = str.find(from);
if(start_pos == std::string::npos)
return false;
str.replace(start_pos, from.length(), to);
return true;
}
int main()
{
time_t t;
struct tm tm;
struct timeval td;
char OutString[254];
t = time(NULL);
localtime_r(&t, &tm);
gettimeofday(&td, 0);
sprintf(OutString + strftime(OutString, 254, "%d.%m.%Y %T", &tm), ".%.3d", (int) (td.tv_usec / 1000));
string haystack = "Soft cat, warm cat, little ball of fur";
string needle = "cat";
string replacement = "kitty";
ReplaceStr(haystack, needle, replacement);
ReplaceStr(haystack, needle, replacement);
cout << haystack;
cout << OutString;
return 0;
}
Лог valgrind: http://pastebin.com/HitRG7fJ