【问题标题】:Assigning value of pointer through argument通过参数分配指针的值
【发布时间】:2016-03-29 11:05:20
【问题描述】:

我有一个结构的构造函数,例如

struct MyStruct{
    int age;
    string name;
    MyStruct_Two * link;
    Mystruct( int age , string name , MyStruct_Two temp){
       this -> age  = age;
       this -> name = name;
       this -> link = temp;
    }
}

我想做的是创建vector<MyStruct> v 来保存这些结构。但是每个结构都有指向另一个数组中另一个结构的指针。

我已经创建了一个函数来使它成为现实 =

vector<MyStruct> v
vector<MyStruct_Two> v_two
void AddStructToStruct( int age , string name ,vector<MyStruct> &v , vector <MyStruct_Two & v_two ){

   MyStruct_Two temp( age , name );  // create struct 

   v.push_back( MyStruct( age , name , *temp ) ); // put pointer as arg
   v_two.push_back( temp );
}

这会抛出:

错误:'operator*' 不匹配。

我试图把引用,甚至指向引用的指针。我在使用指针方面没有太多经验,所以我无法弄清楚如何清楚地做到这一点。

如何通过参数给指针赋值?

【问题讨论】:

  • 我建议你尝试一些更简单的代码来更好地理解指针。删除模板和类。你的问题与那些无关。
  • 你不能让 this -&gt; link 指向在堆栈上创建的东西 - MyStruct_Two temp( age , name );。一旦退出函数调用 AddStructToStructtemp 将被销毁,this-&gt;link 将指向无效的内存位置。您可以通过调用MyStruct_Two temp= new MyStruct_Two( age , name ); 在堆上创建MyStruct_Two,然后将指向temp 的指针传递给MyStruct 的构造函数。请注意,您必须处理堆内存的删除。

标签: c++ pointers struct


【解决方案1】:

您可以使用&amp; 获取一些对象的内存地址,但是...

推入向量会复制(或移动)对象。所以退出函数作用域后指针会悬空。

如果你改成这样:

vector<MyStruct> v
vector<MyStruct_Two *> v_two
void AddStructToStruct( int age , string name ,vector<MyStruct> &v , vector <MyStruct_Two *> & v_two ){

   MyStruct_Two *temp = new MyStruct_Two( age , name ); 

   v.push_back( MyStruct( age , name , temp ) );
   v_two.push_back( temp );
}

这可能会如您所愿,但您还必须稍后delete所有对象。

【讨论】:

  • 如何删除它们?我试过 delete[] v_two 甚至循环 v 向量并删除它的链接属性不起作用
  • delete[] 仅适用于数组。我的建议是遍历v_two 并在每个元素上调用delete
  • 它没有删除它,valgrind还在喊内存没有被释放。
  • 它确实删除了,但 valgrind 可能会变得混乱,因为您不是从相同的上下文中执行它。如果您可以访问 c++11,您可以使用 std::unique_ptr&lt;MyStruct_Two&gt; 并移动到向量中,这样您就不必担心删除,当向量解构时它会完成。
【解决方案2】:

正如 cmets 中所指出的,您应该停下来尝试学习如何正确使用指针。

您的变量 temp 不是指针,它是结构本身,因此您不能使用 * 运算符取消引用它。使这部分代码正确的可能更改如下:

struct MyStruct{
    int age;
    string name;
    MyStruct_Two * link;
    //temp here is a pointer now and expects a address to point to as a parameter.
    Mystruct( int age , string name , MyStruct_Two *temp){
       this -> age  = age;
       this -> name = name;
       this -> link = temp;
    }
}
void AddStructToStruct( int age , string name ,vector<MyStruct> &v , vector <MyStruct_Two & v_two ){

   MyStruct_Two temp( age , name );  // create struct 

   v.push_back( MyStruct( age , name , &temp ) ); // pass the address of the structre.
   v_two.push_back( temp );
}

不确定将本地创建的变量的引用传递给结构体是否是个好主意。

我通常更喜欢使用指针而不是 & 并创建一个动态分配,因此所有内容都指向堆而不是堆栈中的变量。

【讨论】:

  • 将指向局部变量的指针插入容器是一个糟糕的主意。局部变量超出范围,现在您正在存储一个悬空指针。
  • Andre Kostur,正如我所指出的。这里的想法是教他为什么他的代码没有编译。 “不确定虽然这是个好主意”可以被解读为一种礼貌的说法,表示这是一个坏主意。也就是说,如果您使用容器的范围在函数范围内,则可以使用它。
【解决方案3】:

您应该使用 shared_ptr 而不是原始指针。它确实可以防止您出现许多与指针生命周期相关的错误。

vector<MyStruct> v
vector<shared_ptr<MyStruct_Two>> v_two
void AddStructToStruct( int age , string name ,vector<MyStruct> &v , vector <shared_ptr<MyStruct_Two>> & v_two ){

   shared_ptr<MyStruct_Two> temp( new MyStruct_Two(age, name) );

   v.push_back( MyStruct( age , name , temp ) );
   v_two.push_back( temp );
}

而且我觉得对 MyStruct 也使用共享指针会更好。

【讨论】:

    猜你喜欢
    • 2020-04-19
    • 1970-01-01
    • 2020-08-21
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    相关资源
    最近更新 更多