【问题标题】:vector<int*>.push_back() is overwriting values pointed to by front()vector<int*>.push_back() 正在覆盖由 front() 指向的值
【发布时间】:2013-10-21 01:54:15
【问题描述】:

代码在pastebin上:http://pastebin.com/UknqKvMq

所以,我正在置换 0、1、2、3、4、5、6、7、8、9 的所有可能排列(即形成 10 位数字)。我通过调用将每个排列存储在堆上

new int[10]

返回的指针我推到一个

static vector<int*>

现在,当我将指针推到向量上时,第一项指向的数据正在被修改(可能还有向量指向的所有其他项)。我在代码中有许多打印语句显示了这一点,并调用了 sleep() 来减慢进程。为什么会这样?

【问题讨论】:

  • 为什么首先使用整数“数组”,为什么不始终使用向量?
  • @JoachimPileborg 我猜是习惯。
  • @john 解释一下?我对指针很满意,看不出问题。
  • @FluidicTapestry 我赌一分钱,错误是由指针使用引起的。
  • @john 但究竟如何?请对你们进行建设性的工作。

标签: c++ heap-memory stdvector overwrite


【解决方案1】:

您调用Permute,它将指针inputCopy-&gt;arrangement 推入您的静态向量中。然后立即删除它。这意味着您的向量包含悬空指针。

【讨论】:

  • 谢谢!其他人也指出了这一点。愚蠢的错误,我复制了排列代码并稍作修改(它用于复制排列数组)。
【解决方案2】:

我不知道你想在这里做什么,但你可以用几行代码写出来:

使用std::next_permutation

std::vector<int> v{0,1,2,3,4,5,6,7,8,9};
// std::sort(v.begin(), v.end());
do {

    for(const auto&i:v)
      std::cout<<i;
    std::cout<<std::endl;

} while(std::next_permutation(v.begin(), v.end()));

【讨论】:

  • 一开始的排序还有必要吗?
  • @PreetKukreti noop,刚刚评论,退出
  • 我对优化代码行数不感兴趣,而是解决我的内存问题。
  • @FluidicTapestry 很酷,祝你好运,你肯定会得到一些不错的答案
  • @FluidicTapestry 我认为您需要更多的 memcpys 和原始指针操作。还不如发生一些 asm。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
相关资源
最近更新 更多