Утечка памяти в string.replace

Рейтинг: 2Ответов: 0Опубликовано: 10.09.2014

Здравствуйте!
В программе утекает память, запустил через 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

Ответы

Ответов пока нет.