Карта C++ STL, ключ которой - shared_ptr<struct tm>

Для одного из моих проектов мне нужно использовать shared_ptr, чтобы структурировать tm как ключ к карте STL. Ниже мой тестовый код. В цикле for существует два способа создания shared_ptr: 1) TmSPtr tm_ptr = std::make_shared(* tminfo); 2) TmSPtr tm_ptr(tminfo). Оба могут скомпилировать; однако во время выполнения второй метод выдает ошибку: "* Ошибка в`./a.out': free(): неверный указатель: 0x00007f52e0222de0 * Aborted (core dumped) ", указывая, что он пытается освободить память, которая делает не существует. Я все еще новичок в умных указателях, так что, надеюсь, смогу получить некоторую информацию с форума.

Извинения, что я, возможно, включил больше заголовков, чем нужно

#include <iostream>
#include <map>
#include <algorithm>
#include <iterator>
#include <memory>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

using namespace std;

typedef std::shared_ptr<struct tm> TmSPtr;

int main()
{
    cout << "\nTesting a map where key is a smart ptr to struct tm:\n";
    map<TmSPtr, int> price_series;

    for (int i = 0; i < 5; ++i) {
        time_t now;
        time(&now);
        struct tm * tminfo = localtime(&now);
        printf("Current local time and date: %s", asctime(tminfo));

        TmSPtr tm_ptr = std::make_shared<struct tm>(*tminfo); // TmSPtr tm_ptr(tminfo); would fail in run time

        price_series.insert(std::pair<TmSPtr, int>(tm_ptr, i));

        usleep(1000000); // 1 sec
    }
    return 0;
}

2 ответа

localtime(3) говорит: "Возвращаемое значение указывает на статически распределенную структуру...". Это означает, что память не находится в куче, поэтому не должна быть выделена.

Ваш первый метод работает, потому что он копирует структуру.

Общие указатели удаляют свой объект, когда все ссылки на этот объект выходят из области видимости. Это означает, что базовый объект должен быть выделен с использованием new, Но ваш второй метод указывает на статически размещенную переменную, которая уничтожается автоматически. Первый метод создает копию объекта и поэтому безопасен.

Другие вопросы по тегам