C++ 如果对象存储在指针映射中,是否需要删除?

C++ 如果对象存储在指针映射中,是否需要删除?,c++,pointers,memory-management,memory-leaks,C++,Pointers,Memory Management,Memory Leaks,我开始掌握指针并避免内存泄漏 不过我有一个问题。。。在我开始之前,我没有使用C++11,所以请不要回复有关智能指针的信息,以及C++11特有的信息 我有以下代码 class Test { public: Test(const int s_id, const std::string s_name) : id(s_id), name(s_name) { }; const int GetID() { return id; }

我开始掌握指针并避免内存泄漏

不过我有一个问题。。。在我开始之前,我没有使用C++11,所以请不要回复有关智能指针的信息,以及C++11特有的信息

我有以下代码

class Test
{
public:
   Test(const int s_id, const std::string s_name) :
      id(s_id),
      name(s_name)
   {

   };
   const int GetID()
   {
      return id;
   }

private:
   const int id;
   const std::string name;
};

class TestCollection
{
public:
   void AddTest(Test& my_test)
   {
      tests[my_test.GetID()] = &my_test;
   }

   void RemoveTest(const int id)
   {
      if (tests.find(id) != tests.end())
      {
         tests.erase(id);
      }
   }
public:
   std::map<int, Test*> tests;
};

int _tmain(int argc, _TCHAR* argv[])
{
   TestCollection collection;
   Test my_test(0, "First Test");
   collection.AddTest(my_test);

   collection.RemoveTest(0);

    return 0;
}
类测试
{
公众:
测试(const int s_id,const std::string s_name):
身份证,
姓名(s_姓名)
{
};
常量int GetID()
{
返回id;
}
私人:
const int id;
常量std::字符串名称;
};
类TestCollection
{
公众:
无效添加测试(测试和我的测试)
{
测试[my_test.GetID()]=&my_test;
}
无效删除测试(常量内部id)
{
if(tests.find(id)!=tests.end())
{
测试。擦除(id);
}
}
公众:
标准:map测试;
};
int _tmain(int argc,_TCHAR*argv[]
{
测试收集;
测试my_测试(0,“第一次测试”);
collection.AddTest(my_test);
收集。移除测试(0);
返回0;
}
我的问题是,当我调用RemoveTest时,我是否需要做其他事情来清除我的_测试中的内存?为了避免内存泄漏

我知道当我使用新关键字时,我需要调用delete。。。但在这种情况下我该怎么办


它只是被垃圾收集器自动清理吗?

在本例中,收集和我的测试都在堆栈上分配。一旦作用域结束(从_tmain返回),内存将被释放


获取可能存在于变量范围之外的堆栈变量指针将导致不可预测的行为。在这种情况下,如果集合获取对象并存储指针而不是副本。

这取决于对象的分配方式。但是最好发布真实的代码。这些代码实际上不会编译<代码>测试只能存储指针,而您正在尝试存储引用。您只需
删除
分配给
新建的对象
。在其他对象上使用
delete
是未定义的行为(我想)。@JonathanPotter我已经更新了它,所以它可以编译…好了,在你的示例中,现在,你存储了一个指向堆栈上分配的对象的指针。您不需要删除它,因为它将在作用域结束时自动销毁。请注意,删除它的不是
map
,而是在
\u tmain()
返回时自动销毁。但这种模式的用途有限;存储指向基于堆栈的对象的指针是危险的,因为它可能导致使用悬空指针和未定义的行为。还有什么替代方法?要在任何地方使用指针,您可以让TestCollection类创建所传递对象的副本。此副本将驻留在堆中,并将使用新的。在调用Remove时,您需要删除此项。调用方不需要使用指针。我假设您所询问的示例程序只是一个片段。假设您有一个大型应用程序。您将有100个函数/方法操作TestCollection对象。当这样的函数调用测试集合对象上的方法时,该方法就是该方法的调用方。如果存储指向调用方堆栈上分配的对象的指针,则这些指针将仅在变量范围内有效。[链接]()