相关疑难解决方法(0)

如果我将指针设为NULL,则释放同一指针两次不给出错误

我试图两次解除分配相同的指针,但失败了,但如果我按照相同的步骤而不使其为NULL,则代码运行正常.

 #include <iostream>

    struct MyClass {
      MyClass() {std::cout << "Allocated and Constructed" << std::endl ;} 
    };

    int main () {
      // allocates and constructs five objects:
      MyClass * p1 = new MyClass[5];

      delete[] p1;
      delete[] p1; // The code will succeed if I comment this line of code
      p1=NULL;
      delete[] p1;
      delete[] p1;

      return 0;
    }
Run Code Online (Sandbox Code Playgroud)

我看到一个很好的答案问题当你在C++中解除分配指针两次或更多时会发生什么?但是如果我把它设为NULL会使它运行的原因应该是两种情况下应该遵循的行为相同吗?

c++

4
推荐指数
1
解决办法
83
查看次数

检查未解除分配的指针

假设指针对象正在一个点上分配,并且它正被返回到不同的嵌套函数.有一次,我想在检查它是否有效或已经由某人解除分配后取消分配该指针.

是否有任何保证可以使用?

if(ptr != NULL)
   delete ptr;
Run Code Online (Sandbox Code Playgroud)

要么

if(ptr)
   delete ptr;
Run Code Online (Sandbox Code Playgroud)

此代码不起作用.它总是给出分段错误

#include <iostream>
class A
{
    public:
    int x;
     A(int a){ x=a;}
     ~A()
     { 
          if(this || this != NULL) 
              delete this;
     }
};
int main()
{ 
    A *a = new A(3);
    delete a;
    a=NULL;
}
Run Code Online (Sandbox Code Playgroud)

编辑

每当我们谈论指针时,人们就会开始询问,为什么不使用Smart Pointers.仅仅因为智能指针存在,每个人都无法使用它.

我们可能正在使用旧式指针的系统.一天,我们无法将所有这些转换为智能指针.

c++ pointers memory-management

2
推荐指数
1
解决办法
1670
查看次数

在对新的条件调用时调用delete

假设我有以下课程:

foo{
    ~foo();

    private:
        char *bar;
};
Run Code Online (Sandbox Code Playgroud)

在某些条件下,bar会创建一个新的char数组,那么处理删除它的正确方法是什么?一个简单的布尔会做或者会被认为是不好的做法吗?

c++ delete-operator

1
推荐指数
1
解决办法
324
查看次数

删除map <string,string>的内存

我有一个方法返回一个新的映射指针,后来消耗.在使用地图的地方,我有以下代码:

void Updater::set_data(map<string, string> * data)
{
    if (this->data != NULL)
    {
        delete this->data;
    }
    this->data = data;
}
Run Code Online (Sandbox Code Playgroud)

只要应用程序正在运行,此使用者就会运行.

但是,我的应用程序正在泄漏内存并且Valgrind报告它正在泄漏(1个块中的600个(48个直接,552个间接)字节在丢失记录中明确丢失...)在构造映射的行中:

map<string, string> * values = new map<string, string>();
Run Code Online (Sandbox Code Playgroud)

我做错了什么来摆脱地图(并释放内存)?我没有太多的C++经验,所以我猜这是一些初学者的错误,但我花了大量的时间试图计算它可能是什么.

编辑 我只有2个更新程序运行(或者如果我选择了1,但总是预定义的固定数量),并且地图始终包含类似的数据,通常甚至与以前完全相同.

c++ memory-leaks

1
推荐指数
1
解决办法
278
查看次数

在NULL指针上调用delete或delete []

在调用deletedelete []之前总是省略NULL指针检查是否安全,特别是在编写跨平台代码段时?

我记得几年前(三四个)我编写的相同代码正在使用MS Windows(使用MSVCv12工具链编译)但是使用g ++编译的Linux版本(遗憾的是,我不记得g ++版本)抛出了NULL指针引用.我发现当时可能是编译器错误的信息.

我已经找到了这个SO线程,但在阅读之后我仍然不太确定它是否安全,如果是这样 - 从哪个版本的C++标准?

c++ null memory-management

1
推荐指数
1
解决办法
1068
查看次数

在C++中删除未初始化的对象

可能重复:
删除NULL指针是否安全?

在我的头文件中,我声明了一个类范围内的变量:

    FaultModel<double>   *fm_req_set_odom_px;
Run Code Online (Sandbox Code Playgroud)

...在类构造函数中有条件地初始化,具体取决于配置文件的值:

    const char *configModel = ConfigReader->ReadString("FaultModel");
    if (strcmp(configModel, "cyclic") == 0)
        fm_req_set_odom_px = new CyclicFaultModel<double>();
Run Code Online (Sandbox Code Playgroud)

我的问题是:我是否需要用条件包装删除来检查模型是否已初始化,或者在任何一种情况下都可以安全删除它?

   if (fm_req_set_odom_px != NULL) // Is this necessary?
       delete fm_req_set_odom_px;
Run Code Online (Sandbox Code Playgroud)

c++ delete-operator

0
推荐指数
2
解决办法
937
查看次数

c ++ *&amp;和空验证

假设我有以下功能:

void destroy(Song* song) {
    if (song)
        delete song;
}
Run Code Online (Sandbox Code Playgroud)

是否可以将实现更改为以下内容,以删除空验证?

void destroy(Song*& song) {
    delete song;
}
Run Code Online (Sandbox Code Playgroud)

如果是,为什么?

c++ pointers reference dereference

0
推荐指数
1
解决办法
84
查看次数

我们是否必须将一个不指向动态分配内存的指针设置为空?

我很好奇,想知道即使在程序结束后,指针是否仍会指向某个地址。

有人告诉我,在释放内存后,我们应该始终将指针设置为 null,如下所示:

int* num = new int(2);

// do something with num

delete num;
num = nullptr;
Run Code Online (Sandbox Code Playgroud)

但是,如果我的指针没有指向动态内存中的地址,而是指向堆栈中的公共地址,例如:

int num = 2;
int* pnum = &num;

// do something with pnum
Run Code Online (Sandbox Code Playgroud)

那么我是否也应该将指针设置为空?因为我不想让它继续指向一个地址

pnum = nullptr;
Run Code Online (Sandbox Code Playgroud)

如果我不将其设置为 null,一旦我的程序运行完毕,它仍然会指向该地址吗?

我被教导在动态内存用例中始终将指针设置为空,但是指向公共堆栈内存地址的指针又如何呢?

伊迪丝感谢评论中所有情绪激动的人,是的,我是一个 20 岁的菜鸟,还在学习,是的,你太聪明了,没有人能对付你的智商,因为你太聪明了哈哈哈。不要再嘲笑我或其他试图提供帮助的人。对于所有给出简单逻辑解释的人,我很感激。

c++ pointers

-1
推荐指数
1
解决办法
131
查看次数

是否在C++中删除空指针被认为是未定义的行为?

考虑以下代码:

int main() {
  int *i = nullptr;
  delete i;
}
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 删除空指针是否被视为未定义的行为?
  2. 在C++ 11或C++ 14中有什么变化吗?

c++ null-pointer undefined-behavior c++11 c++14

-4
推荐指数
1
解决办法
511
查看次数