Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ Ubuntu上的分段错误(内核转储)_C++ - Fatal编程技术网

C++ Ubuntu上的分段错误(内核转储)

C++ Ubuntu上的分段错误(内核转储),c++,C++,我读过一些关于同一问题的主题,但我找不到代码中的错误。这是头文件: #pragma once class Queue { private: float *elements; int count; float newElement; public: Queue(); Queue(int); Queue(Queue &); ~Queue(); void enqueue(float); float dequeu

我读过一些关于同一问题的主题,但我找不到代码中的错误。这是头文件:

#pragma once

class Queue
{
private:
    float *elements;
    int count;
    float newElement;

public:
    Queue();
    Queue(int);
    Queue(Queue &);
    ~Queue();   

    void enqueue(float);
    float dequeue();

    int getCount();
};
和.cpp文件:

#include "Queue.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

Queue::Queue()
{}

Queue::Queue(int arrSize)
{

    this->count = arrSize;
    float *elements = new float[arrSize];

    for(int i = 0; i < arrSize - 1; i++)
    {
        newElement = rand()% 4000;
        newElement /= 100;
        elements[i] = newElement;
    }

}

void Queue::enqueue(float element)
{
    size_t newSize = count + 1;
    float *new_elements = new float[newSize];
    memcpy(new_elements, elements, newSize);

    count = newSize;
    delete [] elements;
    elements = new_elements;

    elements[count] = element;
}

float Queue::dequeue()
{
    float firstElement = elements[0];


    size_t newSize = count - 1;
    float *new_elements = new float[newSize];
    memcpy(new_elements, elements, newSize);

    count = newSize;
    delete [] elements;
    elements = new_elements;

    return firstElement;
}

int Queue::getCount()
{
    return count;
}

Queue::~Queue()
{
    delete [] elements;
}




int main(int argc, char *argv[])
{
    srand(time(NULL));
    Queue queue(4);

    queue.enqueue(3);




}
#包括“Queue.h”
#包括
#包括
#包括
队列::队列()
{}
队列::队列(int arrSize)
{
此->计数=arrSize;
浮动*元素=新浮动[arrSize];
对于(int i=0;i
我试图弄清楚我的错误在哪里,但是我在C++中是个乞丐。
我认为我的“出列”方法出了问题,在尝试修复它之后,它仍然是一样的。

有几个问题

  • 默认构造函数不初始化其成员
  • Queue::Queue(int arrSize)
    有一个局部变量
    elements
    ,该变量对成员
    elements
    进行阴影处理。因此,此构造函数不会初始化其成员
  • enqueue
    应该复制
    count*sizeof(float)
    字节,而不是
    newSize
    字节
  • 正如@Vladimir所注意到的,
    enqueue
    在分配的内存之外分配一个元素。应该是
    元素[count-1]=元素
  • dequeue
    应该复制
    newSize*sizeof(float)
    字节,而不是
    newSize
    字节

我看到的一件事是,传递给memcpy的大小应该是新数组或旧数组大小中最小的一个,这是一个非常危险和邪恶的默认构造函数。您并没有真正提出具体问题。你为什么认为有什么不对劲?你有什么问题?您到底在做什么来获得分割错误?你有堆芯吗?你们分析了吗?完全同意队列中的最后一行应该使用元素[count-1]谢谢,最大的问题是我的构造函数,我不知道为什么我没有使用这个->元素。