destructor 相关问题

面向对象编程中的一种特殊方法,在对象被销毁时调用

共享指针重置后销毁两次

这里是源代码: unique_lock 锁(_activeFQDNMutex); activeFQDNs.swap(shadowFQDNs); ShadowFQDNs.reset(new TrieRegexInterface()); 重置后,有一个core文件,w...

回答 0 投票 0

如何通过调用 main 范围之外的析构函数来正确终止 C++ 程序

当前的 C++ 标准是否提供了从任何地方关闭程序的工具(例如从函数内部,如 exit()),但尊重堆上预留的资源? 我知道 exit() fu...

回答 2 投票 0

C++ - 为什么双重破坏? [重复]

#include #包括 类对象 { 民众: 对象(){ 标准::计算<< "build" << std::endl; } ~Obj() { std::cout << "destroy&quo...

回答 0 投票 0

即使在 c++ 中的内存取消分配后,二维数组也会导致内存泄漏 [关闭]

我有一个包含二维数组作为私有变量的类。问题是即使内存在析构函数中被取消分配,也会发生内存泄漏。 这是构造函数(“行...

回答 0 投票 0

析构函数是否删除了正确的实例[重复]

我在带有最新更新的 Visual Studio 2022 社区版中使用 Visual C++。在下面的 C++ 代码中,main 创建了一个 ShowBug 实例并将其分配给变量 sb。下一个……

回答 1 投票 0

free():释放动态创建的类实例的 malloced 成员时出现无效指针错误,该实例本身是不同类的成员

有一类WT。 当创建类的实例时,其成员之一 wv_object 被分配 类 WT { 民众: WT(int signalSize, int numLevels); 〜重量(); 诠释

回答 0 投票 0

内存没有被正确释放

我正在处理我的哈希表分配,其中正在将大量数据(从 csv 文件)读取到哈希表中。此分配的要求是使用原始指针(没有#include 我正在处理我的哈希表分配,其中大量数据(从 csv 文件)被读取到哈希表中。此分配的要求是使用指向 DataEntry 类的原始指针(也没有 #include <memory> 库)。 (虽然很讨厌,但还是要跟着) 我大部分都涵盖了它并且程序可以运行,但是当我运行像valgrind这样的工具时: valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --num-callers=20 --log-file=valgrind.log ./main 说明我输了: ==4044056== LEAK SUMMARY: ==4044056== definitely lost: 17,511,840 bytes in 243,220 blocks ==4044056== indirectly lost: 1,257,494 bytes in 39,329 blocks ==4044056== possibly lost: 391 bytes in 6 blocks ==4044056== still reachable: 20,626 bytes in 292 blocks ==4044056== suppressed: 0 bytes in 0 blocks 这是我的 CovidDB 类,由于使用单独的链接来避免冲突,哈希表由 2D 向量表示: private: int size = 17; std::vector<std::vector<DataEntry*>> HashTable; public: inline CovidDB() { HashTable.resize(size); } inline ~CovidDB() { for (auto& row : HashTable) { for (auto& entry : row) { delete entry; } row.clear(); } HashTable.clear(); HashTable.shrink_to_fit(); std::cout << "IN HERE" << std::endl; } 我做了一些关于如何从二维向量中删除内存的研究,发现 clear() 删除元素而 shrink_to_fit() 处理内存。更改后我仍然泄漏了很多内存所以我认为我的析构函数没有被调用。 我在析构函数中放了一个cout语句,看看它是否被调用了。 "IN HERE" 根本没有打印到终端。 我的教授要求我们的 main.cpp 文件中只有 1 个函数: #include "CovidDB.h" #include "run.h" int main(int argc, char *argv[]) { run(); return EXIT_SUCCESS; } 这可能是错误的根源吗?有没有不同的方式来处理内存?我如何显式调用析构函数?我试过: CovidDB dataBase; dataBase.~CovidDB(); 我收到一条错误消息,说没有匹配的运算符。 这是我分配内存的添加函数: bool CovidDB::add(DataEntry* entry) { time_t now = time(0); tm* ltm = localtime(&now); // DATE FORMAT: mm/dd/yy std::string current_date_str = std::to_string(1 + ltm->tm_mon) + "/" + std::to_string(ltm->tm_mday) + "/" + std::to_string(ltm->tm_year % 100); std::istringstream iss(current_date_str); std::tm current_date = {}; iss >> std::get_time(&current_date, "%m/%d/%y"); std::tm entry_date = {}; std::istringstream iss2(entry -> get_date()); iss2 >> std::get_time(&entry_date, "%m/%d/%y"); if (mktime(&current_date) > mktime(&entry_date)) { std::cout << "[Record rejected]" << std::endl; return false; } int index = hash(entry -> get_country()); assert(index < 17 and index >= 0); if (HashTable[index].empty()) { HashTable[index].push_back(new DataEntry(*entry)); } else { bool added = false; for (DataEntry* existing_entry : HashTable[index]) { if (hash(existing_entry->get_country()) == hash(entry->get_country()) && existing_entry->get_country() == entry->get_country()) { existing_entry->set_c_cases(existing_entry->get_c_cases() + entry->get_c_cases()); existing_entry->set_c_deaths(existing_entry->get_c_deaths() + entry->get_c_deaths()); added = true; break; } } if (!added) { HashTable[index].push_back(new DataEntry(*entry)); } } return true; } 这是我在 main 中调用的“主要”函数 void set_data(DataEntry* data, std::string country, std::string date, int cases, int deaths) { data->set_country(get_country(country)); data->set_date(get_date(date)); data->set_c_cases(get_covid_cases(cases)); data->set_c_deaths(get_covid_deaths(deaths)); } void run() { /** DECLARATIONS: */ std::cout << std::endl << std::endl << std::flush; CovidDB dataBase; DataEntry *data = new DataEntry; std::string country = "\n"; std::string date = "\0"; int cases = 0; int deaths = 0; /** DECLARATIONS: */ while(true) { menu(); switch(get_input()) { case OPID::ID_1: { dataBase.add_covid_data(COVID_FILE); break; } case OPID::ID_2: { set_data(data, country, date, cases, deaths); dataBase.add(data); //fix break; } case OPID::ID_3: { dataBase.get(get_country(country)); break; } case OPID::ID_4: { dataBase.remove(get_country(country)); break; } case OPID::ID_5: { dataBase.display_table(); break; } case OPID::ID_6: { goodbye(); std::exit(EXIT_SUCCESS); break; } default: { /** @note do nothing...*/ } } } std::cout << std::endl << std::endl << std::flush; } 制作文件: CXX = g++ CXXFLAGS = -std=c++11 -Wall -Werror -pedantic -O2 SRCS = run.cpp CovidDB.cpp main.cpp OBJS = $(SRCS:.cpp=.o) EXEC = main .PHONY: clean all: $(EXEC) $(EXEC): $(OBJS) $(CXX) $(CXXFLAGS) $(OBJS) -o $(EXEC) %.o: %.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ clean: rm -f $(OBJS) $(EXEC) 项目本身很大,我不想把所有东西都贴在这里。如果我错过的其他一些功能需要进一步分析,请告诉我。 谢谢。 我尝试更改析构函数并尝试调试它,但这只显示了内存分配的位置。我虽然可以在析构函数中删除整个哈希表,但我想不能。 我看到你有一个析构函数正在删除已分配的哈希条目。但是,您正在执行冗余分配并且没有代码删除在“添加”函数中被拒绝的哈希条目 HashTable[index].push_back([ new DataEntry(*entry) ); 指针指向的内存已经分配。再次调用 new 不会将指针的内存转移到新地址。相反,它将分配一个不同的指针到不同的“条目”。您最终会在不同的地址得到两个相同的“条目” 如果析构函数不会清理分配的内存,请务必删除指针。 //In add hashTable[index].push_back(entry); //... if(!added) { //... return false; } //In run //... case OPID::ID_2: { set_data(data, country, date, cases, deaths); if(!dataBase.add(data)) { delete data; } break; //...

回答 1 投票 0

默认构造函数会调用MPI_Comm_free吗?

假设我们有以下代码: #包括 #包括 #包括 类我的类{ 民众: MyClass(std::vector& v0, ...

回答 0 投票 0

首先出现的是析构函数还是 delete() ? C++

该站点上的许多答案都提到 delete() 调用析构函数。但是下面的示例代码似乎在析构函数中调用了 delete()。初始化对象时 delete() 的正确用法是什么...

回答 1 投票 0

如何为两个在不同文件中相互引用的对象调用析构函数?

我在单独的文件中有 2 个名为 student 和 course 的类以及构造函数等: //学生.h 班级课程; 班级学生{ 民众: 〜学生(); 私人的: 当然 *course_ref; }...

回答 1 投票 0

C++ 中的运算符 = 和析构函数

在 = 运算符中,我想用参数中想到的任何内容替换 m_Sent 和 m_Acept 的内容。 m_Acept 和 m_Sent 是指向链表的指针。我首先删除是正确的...

回答 0 投票 0

基类有无法访问的析构函数

以下代码尝试使用标准容器 std::vector 和 std::unordered_map 定义自相似数据结构 JSON,但未编译。这一切似乎都归结为 std::unordered_ma ...

回答 1 投票 0

首先调用什么:静态对象的析构函数或atexit处理程序?

这种情况下是保证订单还是UB? #包括 #包括 使用命名空间标准; 结构 TraceHelper { 跟踪助手() { 计算<< "

回答 2 投票 0

派生类销毁后使用基类成员

假设我们有一个简单的结构: 结构 RefCounters { size_t strong_cnt; size_t weak_cnt; RefCounters() : strong_cnt(0), weak_cnt(0) {} }; 从实现的角度来看,析构函数

回答 2 投票 0

C#,有没有像golang一样的'Defer Call'?

golang 支持“延迟调用”,当 c++ 时,我使用这个技巧(?)。 结构延迟调用 { 延迟调用(){} ~DeferCall() { doSomeThing(); } } void SomeMethod() { 延迟调用延迟调用; ... } 哈...

回答 6 投票 0

状态就绪时立即销毁 std::promise

考虑以下代码: void runSomething() { std::promise 承诺; startWorkAndCallBackFromDifferentThread([&]{ promise.set_value(); }); promise.get_future()....

回答 1 投票 0

这是释放新对象的正确方法吗?

#include 类伙计 { 民众: 年龄; 伙计(年龄) { 这个->年龄=年龄; } }; int main(int argc, char* argv[]) { 花花公子 *花花公子 1 = 新花花公子 (21); 标准::

回答 1 投票 0

如何让 lint 跟踪指向向量的保管指针?

我有一些代码循环和更新一些指针并将它们存储在一个向量中: std::vector m_octets; ... InputBox* octet = new InputBox(rect, title, touch_num); m_octets.

回答 1 投票 0

识别 C++ 中析构函数的正确格式

我遇到过这个问题: 给定 A 类: A类{ 民众: 整数大小,** x,*** y; A(int _size) { 尺寸 = _尺寸; x = 新整数* [大小]; ...

回答 2 投票 0

具有指针作为资源的类的析构函数被调用两次 - C++ 中可能存在多线程问题?

我在运行我的C++代码时遇到了运行时错误,在调试它时,我发现类A的析构函数被调用了两次。我不确定为什么会这样。第一个电话是...

回答 0 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.