分配类成员变量时的C ++分段错误

时间:2017-05-25 18:14:06

标签: c++ pointers segmentation-fault

我有一个功能" testfunc()"在课堂上#34;测试"在名称空间下" TEST_NS"。

在主程序中,我创建了一个指向"测试"并且想指向" testfunc()"功能。没问题......

我声明了一个私人变量" foo"作为" Test"的成员," testfunc()"函数尝试更改变量。这导致分段错误。

为什么会这样?

我已经创建了一个简单的例子来展示我的问题。当我在test.cpp

中设置foo = 1;时发生了段错误

以下是文件:

main.cpp中:

#include <iostream>
#include "test.h"

using namespace std;

int main () {
  TEST_NS::Test * test;
  test->testfunc();
  return 0;
}

test.h:

#include <iostream>

namespace TEST_NS
{
  class Test
  {

  int foo;

  public:
    Test();
    ~Test();

    void testfunc();
  };
}

TEST.CPP:

#include <iostream>
#include "test.h"

using namespace TEST_NS;

Test::Test() { }

Test::~Test() { }

void Test::testfunc()
{
  std::cout << "This is testfunc()!" << std::endl;

  foo = 1;

}

代码是用

编译的
g++ main.cpp test.cpp -o test 

运行
./test

2 个答案:

答案 0 :(得分:3)

您的main()功能需要更改; 首选编写它的方式是

int main () {
  TEST_NS::Test test;
  test.testfunc();
  return 0;
}

如果你真的想使用指针(为什么?),那么你应该写:

int main () {
  auto test = new TEST_NS::Test();
  test->testfunc();
  delete test;
  return 0;
}

注意添加delete test;。但这是不好的做法,因为它会产生内存泄漏的可能性,尤其是在添加更多代码时(或者如果testfunc()抛出异常)。如果你真的需要使用指针,那么使用std::unique_ptr<>会更好

int main () {
  auto test = std::make_unique<TEST_NS::Test>();
  test->testfunc();
  return 0;
}

请注意,这也消除了明确的new,这通常是一个好主意,以及必须添加的delete;另外,它是例外安全的。

现代C ++中“裸”newdelete的理由很少。请注意,您仍然可以使用get()获取“原始”指针,但首选dereferencing

 void testfunc(TEST_NS::Test& test)
 {
    test.testfunc();
 }
 // ...
 testfunc(*test);

答案 1 :(得分:2)

您需要实例化您的类的对象;尝试

TEST_NS::Test * test = new TEST_NS::Test();
test->testfunc();