gpt4 book ai didi

C++ STL 映射,其键为 shared_ptr

转载 作者:行者123 更新时间:2023-11-30 01:48:50 25 4
gpt4 key购买 nike

对于我的一个项目,我需要使用 shared_ptr 来构造 tm 作为 STL 映射的键。下面是我的测试代码。在for循环中,有两种创建shared_ptr的方式: 1) TmSPtr tm_ptr = std::make_shared(* tminfo); 2) TmSPtr tm_ptr(tminfo)。两者都可以编译;然而在运行时,第二种方法抛出错误:“* Error in `./a.out': free(): invalid pointer: 0x00007f52e0222de0 * Aborted (core dumped)”,表示它试图释放不存在的内存。我对智能指针还是很陌生,所以希望能从论坛中获得一些见解。

抱歉,我可能包含了比需要更多的 header

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

最佳答案

localtime(3)说:“返回值指向一个静态分配的结构......”。这意味着内存不在堆上,因此不应取消分配。

您的第一个方法之所以有效,是因为它复制了结构。

关于C++ STL 映射,其键为 shared_ptr<struct tm>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29812506/

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