0

我只是想确保没有任何潜在的问题。它编译并运行良好,但我是否冒着任何奇怪的记忆效应的风险?在这种情况下,我是否需要特别关注例外情况?

//...constructor of some class
myobj(int length, int *vars)
{
    // do stuff with vars
}

// inside some other code somewhere
int vars[3] = {5,6,7};
myobj *o = new myobj(3,vars);

(编辑。)我只是担心,因为我知道应该始终谨慎使用指向堆栈上对象的指针。为了具体说明我的用法,我主要希望以最快的方式传递相同类型的可变数量的参数。那么这是一个不好的方法吗?谢谢..

后记。所有的答案都非常有帮助,谢谢!我会看看性能是否足以使用这种方法,或者我是否可以完全以另一种方式解决问题。

4

3 回答 3

1

只要您不超出调用构造函数中的数组或以其他方式滥用所涉及的内存,这很好。

虽然它不是很好的 C++ - 使用const vector<int>&作为参数有什么问题?

特别是,不要将指向基于堆栈的数组的指针存储myobj在从它创建的实例中 - 即。您必须将输入int值复制到类中,除非您使用类似boost::shared_array的东西。

于 2011-07-07T20:20:36.150 回答
1

如果您的myobj类出于某种原因存储了指向 的指针int[],那么您就会为各种麻烦打开大门——当原始vars数组超出范围时,您会留下一个悬空指针;你不能轻易复制你的课程;你必须考虑异常安全;等等等等

就像史蒂夫建议的那样,最好使用一个标准的库容器来处理你的问题。

参考你的问题的标题,如果你真的只是将数组传递给“一些自由函数”,那么这可能是可以原谅的,但你明确地说你在动态分配对象的构造函数中使用它。那只是麻烦的味道。

于 2011-07-07T20:25:05.180 回答
1

这本身并没有什么错。但是,您需要注意以下几点:

  • vars返回后(或至少在超出范围后)不要保留指向周围的指针。vars仅在您离开声明它的范围之前有效。
  • 确保你没有跑出vars阵列的末端。

在 C++ 中使用更常见的样式,例如std::vector<int> &参数或其他容器类型。这有两个主要原因:通过作为引用传递,更明显的是您可能不打算保留指向对象的指针,并且通过传递向量,数组的大小与数组一起保存本身(如果需要,您也可以扩展数组)。然而,这是一个风格问题,并且有开销vector,所以如果性能非常重要,这种方法是完全合理的。

于 2011-07-07T20:25:52.347 回答