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;