尝试在C ++中删除空地址(不是NULL)的数组指针

时间:2016-12-12 10:15:46

标签: c++ arrays pointers

我创建了一个包含像素强度值数组的类。复制此类时,我收到一个错误,就好像我正在尝试删除未分配的数组。因为我很确定我没有在类的创建和复制之间设置指针的指向地址,所以指针的地址与NULL之间的区别是如此神秘。如何检查空尖的地址?

for ii: some_array index=-5:5; %I assume you fill this differently index(index<1 || index>size(A,1))=[] % delete out of bounds sum(A(index)) end

不起作用。

课程:

data_ == reinterpret_cast<const unsigned char *>("")

问题:

Status of the variable at the time of breaking

4 个答案:

答案 0 :(得分:4)

在复制构造函数中,成员变量尚未初始化,htmltext = urllib.request.urlopen(req).read().decode('utf-8') 没有任何内容。

相反,成员变量delete[]将具有不确定值,并且它看似随机且很可能不等于空指针,这意味着您将 undefined行为

最简单的解决方案?不要data_使用未初始化的指针。

复制构造函数就像任何其他构造函数一样,在创建实例时调用它。不会为复制构造调用其他构造函数,只调用复制构造函数。

答案 1 :(得分:3)

    if (data_)
        delete[] data_;  // ERROR BEING THROWN HERE

数据尚未初始化,您在复制构造函数中;不会为您调用默认构造函数。

删除这两行将删除您对未初始化变量的访问权限并解决您的问题。

正如马科斯在评论中所说 - 你可以通过使用智能指针来更好地解决问题

答案 2 :(得分:2)

  

尝试删除空地址(非空)

的数组指针

没有这样的事情。有空指针(值0),并且指针有非空值。非空指针可以指向或不指向有效对象。也许通过&#34;空&#34;你的意思是指向的对象无效。

  

如何检查空的尖头地址?

无法检查指向的对象是否有效。只要您使用它,就必须确保指针始终指向有效对象。

只有2种情况可以在指针上调用delete[]

  • 无效
  • 指针由new[]返回,指针先前未被删除。

在每个其他情况下删除指针会导致UB。指针不符合这些要求的情况:

  • 指针从未初始化。例如:

    T* data_;
    
  • 指针初始化为new[]未返回的值。例子:

    T* data_ = new T;
    T* data_ = reinterpret_cast<const unsigned char *>("");
    
  • 指针由new[]返回,但之前已被删除。这被称为悬空指针。

    T* data_ = new T[10];
    delete[] data_;
    // data_ is a danging pointer here
    
PixelArray(const PixelArray& other)
{
    if (data_)
        delete[] data_;  // ERROR BEING THROWN HERE
  

对我来说,指针的地址与NULL

之间的区别是如此神秘

指针尚未初始化,因此未指定其值。只有在初始化或将其分配为NULL时才会为NULL。

您正在删除未初始化的指针,因此该程序具有未定义的行为。

PS。检查data_是否为空是多余的,因为删除空指针是安全的。

直接问题的原因:不要尝试删除未初始化的指针 - 删除复制构造函数的前两行。解决其他问题:使用std::vector。这将修复您的错误并大大简化代码。

  

[我不使用std::vector]因为在代码的其他部分,我使用四个指针遍历数组,在循环的每个循环中将其指向的地址加1。

std::vector并不妨碍您这样做。

  

但我想如果它没有降低性能,可以用矢量迭代器完成(在这种情况下性能很重要)。

也可以使用迭代器来完成,而且我知道没有技术上的理由说明为什么它们的性能会低于指针。

答案 3 :(得分:0)

您不必在复制构造函数中删除[] data_,因为还没有分配data_。

我认为你想用delete []数据实现的目标应该在赋值运算符函数中完成。

PointerArray& operator=(const PointerArray& other) {
    if (data_){delete[] data_;}
    //allocate data_ and copy the contents from other.data_
    //rest of the assignment code here
}