Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 谁删除C+中的指针(不是用new创建的)+;?_C++_Pointers - Fatal编程技术网

C++ 谁删除C+中的指针(不是用new创建的)+;?

C++ 谁删除C+中的指针(不是用new创建的)+;?,c++,pointers,C++,Pointers,我试图理解指针背后的概念。 我有一个函数,其中我将指向对象的指针设置为结构的属性: void util::setobject(string s) { Document* d; d->Parse(s.c_str()); message.payload = d; { 在这个函数之外,我可以调用message对象并访问文档。现在我第二次调用这个函数,所以我覆盖负载并设置一个指向新文档的新指针。据我所知,旧文档对象仍然存在,但没有任何东西指向它正确吗?该对象是否会自动删除? 谢

我试图理解指针背后的概念。 我有一个函数,其中我将指向对象的指针设置为结构的属性:

void util::setobject(string s)
{
   Document* d;
   d->Parse(s.c_str());
   message.payload = d;
{
在这个函数之外,我可以调用message对象并访问文档。现在我第二次调用这个函数,所以我覆盖负载并设置一个指向新文档的新指针。据我所知,旧文档对象仍然存在,但没有任何东西指向它正确吗?该对象是否会自动删除? 谢谢

编辑 很抱歉,我把这个代码示例搞砸了。 所以我有两个选择:

选项1:使用指针

void util::setobject(string s)
    {
       Document* d = new Document();
       d->Parse(s.c_str());
       message.payload = d;
    {
为了避免内存泄漏,我需要在指定新值之前删除指向的对象,对吗

void util::setobject(string s)
{
   Document* d = new Document();
   d->Parse(s.c_str());
   delete message.payload; // correct?
   message.payload = d;
{
第二种选择:避免使用“新”

圣公会。这样做是行不通的,因为d超出了范围:

void util::setobject(string s)
{
  Document d;
  d.Parse(s.c_str());
  message.payload = &d; // does not make sense correct?
{
这可能是s.th。脱离主题,但第二个版本要求结构如下所示:

struct MESSSAGE
{
  string topic;
  bool done = true;
  Document payload;
}
文件来自。在没有指针的情况下执行此操作会导致多个错误:

error: use of deleted function 'Message::Message(const Message&)'

'rapidjson::GenericDocument<Encoding, Allocator, StackAllocator>::GenericDocument(const rapidjson::GenericDocument<Encoding, Allocator, StackAllocator>&) [with Encoding=rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<>; StackAllocator=rapidjson::CrtAllocator]' is private within this context
错误:使用已删除的函数“Message::Message(const Message&)”
“rapidjson::GenericDocument::GenericDocument(const rapidjson::GenericDocument&)[with Encoding=rapidjson::UTF8;Allocator=rapidjson::MemoryPoolAllocator;StackAllocator=rapidjson::CrtAllocator]”在此上下文中是私有的
还有人知道如何解释这些错误吗?我认为文档的复制构造函数是私有的,因此我需要在这里使用指针,对吗

void util::setobject(string s)
{
   Document* d = new Document();
   d->Parse(s.c_str());
   delete message.payload; // correct?
   message.payload = d;
{
<>谁删除C++中的指针(不是用new创建)?< /p> 只要程序定义良好,就没有人删除不是用new创建的指针,因为只有用allocationnew创建的指针才能被删除


此示例的行为未定义,因为您通过未初始化的指针间接调用,并试图通过它调用成员函数

在这里,复制一个不确定的值。行为也因此未定义

。。。可以像这样使用

你错了。没有指针可以像这样使用

因此,我覆盖有效负载并设置一个指向新文档的新指针

在本例中,您没有设置指向“新文档”的指针。您从未在示例中创建过文档

据我所知,旧文档对象仍然存在

如果使用
message.payload
指向文档对象,则该对象仍然存在。您没有在示例中演示这种情况

但没有任何证据表明这是正确的

视情况而定。一个对象可以有许多指针,因此覆盖一个指针并不一定意味着不再有指向该对象的指针。但事实上,这是一种可能的情况——在示例中没有演示

该对象是否会自动删除

取决于对象的存储类。自动对象在超出范围时会自动销毁(名称中有提示)。程序结束时,静态对象将自动销毁。线程退出时,线程本地对象将自动销毁。临时对象在完全表达式结束时自动销毁(有时扩展)

动态对象不会自动销毁。它们只有在明确销毁或删除时才会被销毁。若指向动态对象的最后一个指针被覆盖,那个么该对象就被称为已泄漏。嗯,动态平凡对象可以通过在其位置创建另一个对象来自动销毁,但动态内存不会自动释放


关于编辑的问题

为了避免内存泄漏,我需要在指定新值之前删除指向的对象,对吗

void util::setobject(string s)
{
   Document* d = new Document();
   d->Parse(s.c_str());
   delete message.payload; // correct?
   message.payload = d;
{
取决于旧指针指向的对象。如果它指向通过分配
new
创建的动态对象,并且没有其他指针负责删除,则为“是”。否则,不会

还有人知道如何解释这些错误吗


文档
不可(公开)复制,您试图复制包含此类不可复制文档的
消息

您的代码中没有
文档
,因此无法
删除

这个函数的作用是什么

详情如下:

它将
d
声明为指向
文档的指针,并使该指针未初始化。然后,第二行取消对未初始化指针的引用并导致

我建议您阅读,因为您的函数实际上应该如下所示:

void util::setobject(string s)
{
   Document d;
   d.Parse(s.c_str());
   message.payload = d;
}
如果您不能/不想将
有效负载
更改为
文档
(不是指针),则需要创建
文档

  Document* d = new Document;

但是,这里不应该使用原始指针。查看
std::shared_ptr
std::unique_ptr
。原始指针不应拥有内存。“拥有”某物意味着负责删除它。智能指针为您做到了这一点,而原始拥有指针是desaster的秘诀,应该避免(不要误解:原始指针很好,问题是拥有原始指针)。

回答标题问题:没有人

只有指向
new
分配的对象的指针才应该是
delete
d,只有指向
new[]
分配的对象的指针才应该是
delete[]
d

不能删除指向具有static1、thread local2或automatic3的对象的指针,该语言指定如何以及何时销毁这些对象

  • “全局”对象
  • “每线程全局”对象
  • “在堆栈上”对象

  • 此代码无效,
    d
    未初始化使用。文档来自RAPD,可以像this@m_3464gh您没有可用于任何用途的
    Document
    实例。您只有一个非斜体指针
    void util::setobject(string s)
    {
       Document d;
       d.Parse(s.c_str());
       message.payload = d;
    }
    
      Document* d = new Document;