【问题标题】:Issue settings value to deque pointer向双端队列指针发出设置值
【发布时间】:2016-04-27 01:03:45
【问题描述】:
#include <iostream>
#include <string.h>
#include <deque>

using namespace std;

void insertValues(deque<float*> mydeque)
{
    *mydeque.at(0)=12;
}

void initArray(deque<float*> mydeque, float* values)
{
    for(int i=0;i<3;i++)
        mydeque.push_back(values+i);
}

int main ()
{
    float values[3];
    deque<float*> mydeque;
    initArray(mydeque,values);

    insertValues(mydeque); //Gives out of range - memory error

    cout<<values<<" "<<values+1<<" " <<values[0]<<endl;
    values[0]=5;
    cout<<values<<" "<<values+1<<" " <<values[0]<<endl;

    getchar();

    return 0;
}

在上面的代码中,我在调用 insertValues() 函数时遇到了内存问题,它给出了超出范围的错误,但我不知道为什么会发生这种情况,因为双端队列具有我验证的正确地址。

我哪里出错了?

【问题讨论】:

  • 为什么你有deque&lt;float*&gt; 而不是deque&lt;float&gt;?为什么要使用指针?看起来您是故意试图导致代码出现问题。
  • 在我的例子中,我处理的值被其他函数或线程修改了,所以不知道除了使用指针浮动之外还能做什么。 (上面的代码只是我在主代码库中实际实现功能之前尝试的示例。)

标签: c++ pointers stl deque


【解决方案1】:

你的问题就在这里。

void initArray(deque<float*> mydeque, float* values)
{
    for(int i=0;i<3;i++)
        mydeque.push_back(values+i);
}

mydeque 将成为您传递的任何内容的副本,mydeque 被填充并随后被销毁。最初传递的参数保持不变。 修改它以通过引用获取参数...

void initArray(deque<float*>& mydeque, float* values)
{
    for(int i=0;i<3;i++)
        mydeque.push_back(new float(values+i);
}

尽管您的代码可以按原样运行,但您不应使用指向 float 的指针的 std::deque。它的方式太脆弱了,而且在时间和记忆方面的表现也较差。更喜欢按值使用整数类型。

【讨论】:

  • 感谢您的回答。就我而言,我处理的值是浮点数,它们被其他函数或线程修改,所以除了使用指向浮点数的指针之外,我不确定还能做什么。 (上面的代码只是我在主代码库中实际实现功能之前尝试的示例。)
  • 另外,我想知道在使用浮点数时访问时间真的很长,为什么你认为使用整数类型会更有效?这背后的逻辑是什么?
猜你喜欢
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多