-1

我有一个名为“Vertex.hpp”的类,如下所示:

 #include <iostream>
 #include "Edge.hpp"
 #include <vector>
   using namespace std;

/** A class, instances of which are nodes in an HCTree.
 */
class Vertex {
public:
Vertex(char * str){
 *name=*str;
 }

vector<Vertex*> adjecency_list;
vector<Edge*> edge_weights;
char *name;

 };

#endif 

当我按如下方式实例化 Vector 类型的对象时:

 Vertex *first_read;
 Vertex *second_read;

  in.getline(input,256);

  str=strtok(input," ");
  first_read->name=str;


  str=strtok(NULL, " ");
  second_read->name=str;

当实例化超过 1 个 Vector 类型的对象时,会发生分段错误。如果实例化超过 1 个对象,为什么会发生这种情况,如何允许实例化多个对象?

4

3 回答 3

2
*name=*str;

在你首先使它指向某个东西之前,你不能取消引用一个指针。

你的意思可能是这样的:

Vertex(char * str) {
    name=strdup(str);
}

但你真的应该使用std::string.

于 2012-12-04T23:02:25.983 回答
0

我认为你复制字符串的方式是错误的。

*name=*str;

两个nameansstr都是 char* 类型。您正在取消引用这些指针。这意味着您查看它们指向的内存位置并将其解释为字符。

当您第一次调用它时,某些东西位于指向的位置,str并且它的第一个字符被复制到随机地址(因为您从未初始化过name)。

第二次你就没那么幸运了。strtok在 cplusplus上调用 NULL 返回 NULL strtok

现在您尝试使用空指针指向的内存,这很糟糕。

您需要分配内存name并使用正确的复制功能。

name = new char[SomeMaxLenght];
strcpy(name, str);
于 2012-12-04T23:19:53.900 回答
0

这是一种非常 C 的做事方式,在现代 C++ 中是非常不推荐的。请记住,C++ 应该被视为一种不同的语言,而不是 C 的严格超集。

首先,您应该通过查看该列表真正获得一本好书,因为您似乎缺少许多基础知识。

至于您的问题,主要问题是name未初始化,因此您遇到了所谓的未定义行为(即任何事情都可能发生;在您的情况下,它在第二次实例化时崩溃)。我可以深入探讨如何通过动态分配内存来修复它,但是为什么要麻烦呢?只需使用std::string

class Vertex {
    std::string name; // string instead of char *
public:
    Vertex(const std::string &str) { // pass by const reference
        name = str; // I should really use an initializer list there, but oh well
    }

    // the rest of the class is the same
};

看看这有多简单?现在您不必乱用指针,使用起来很痛苦。所以,简而言之:使用标准库。并获得一本好书。真的。

于 2012-12-04T23:20:51.007 回答