【问题标题】:Swapping void* pointers in C++在 C++ 中交换 void* 指针
【发布时间】:2013-07-09 00:31:40
【问题描述】:

我想问这种交换实现是否可行:

 void swap (void* &a, void* &b ) 
 {    
     void * tmp = a;
     a=b;
     b=tmp;
 }

int main() 
{
   void * a;
   void * b;   
   swap (a,b);
   return 0;
}

我是否需要以某种方式将对象的大小发送到交换方法并使用它?如果是这样,那么这个函数的一个好的实现是什么?

【问题讨论】:

  • 已经将大小发送到 swap 方法。您说,“这里有两个 void 指针,请交换它们”。大小为sizeof(void *)

标签: c++ swap void void-pointers


【解决方案1】:

它有效。我不确定它是否像您认为的那样:指针值被交换,而不是它们指向的任何东西。

【讨论】:

  • 什么意思? a now 不会指向 b 指向的任何内容,反之亦然吗?还是您的意思是他们没有更改实际值,而只是更改了地址?
  • 假设您有一个int *a, *b; a = new int(42); b = new int(17); swap(a, b);,现在a 将指向最初为b 分配的内存,而b 将指向最初为a 分配的内存。换句话说,4217 的值保持在原来的位置。这取决于您实际想要达到的目标,无论这是否是您想要的。
  • 我的意思是,在以下代码中:f() { some_type x,y; void *a = &x, *b = &y; swap( a, b); } 对象 x 和 y 不会改变(没有交换)。但现在 a 将指向 y,b 指向 x。
【解决方案2】:

这个函数可以很好地交换void 指针;编译器知道它们的大小。如果你想交换除void 指针以外的东西,你需要一个不同的函数。

编辑:但这是交换模板函数的一般模式:

template <class Ty>
void swap(Ty& lhs, Ty& rhs) {
    Ty tmp = lhs;
    lhs = rhs;
    rhs = tmp;
}

【讨论】:

    【解决方案3】:

    对我来说看起来不错(指针只是一个指针,所以它所指向的东西的大小并不重要),但为什么不直接使用std::swap

    在这个例子中,你搞乱了未初始化的变量,这很糟糕,但这似乎不是你问题的重点。

    【讨论】:

      猜你喜欢
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 2012-11-21
      相关资源
      最近更新 更多