执行字符串分配时 C++ 程序崩溃
Posted
技术标签:
【中文标题】执行字符串分配时 C++ 程序崩溃【英文标题】:C++ Program crash when doing string assign 【发布时间】:2016-07-18 13:59:57 【问题描述】:我有一个奇怪的问题,这是我的代码:
test.h
#ifndef _test_
#define _test_
#include <iostream>
#include <string>
class Test
public:
Test();
~Test();
void addName(std::string _Name);
private:
std::string Name;
;
#endif // _test_
test.cpp
#include "test.h"
Test::Test()
Test::~Test()
void Test::addName(std::string _Name)
std::cout << _Name << std::endl;
Name = _Name;
std::cout << _Name << std::endl;
main.cpp
#include "test.h"
int main(int argc, char* argv[])
Test* project;
project->addName("abc");
return 0;
结果:
abc
程序意外结束。
【问题讨论】:
为什么将project
声明为指针?我建议您摆脱它作为指针,将->
更改为.
后代码应该可以正常工作。
与您的问题完全无关,但don't use leading underscore followed by an upper-case letter, such symbols are reserved in all scopes。
为什么选择将对象声明为指针?
【参考方案1】:
那是因为你有一个指向 Test
对象的指针,但它实际上并没有指向任何地方。当您尝试取消引用指针时,这会导致未定义的行为。
将对象声明为实际对象,而不是指针:
Test project;
project.addName("abc");
【讨论】:
【参考方案2】:指针project
是默认初始化的,具有不确定的值,因此取消引用它很有可能导致程序异常终止。
尝试在取消引用之前创建一个对象并分配它,如下所示:
#include "test.h"
int main(int argc, char* argv[])
Test* project = new Test;
project->addName("abc");
delete project;
return 0;
【讨论】:
这里没有理由使用new
。
@crashmstr is 如果 OP 希望使用 *project
,则需要在此处使用 new
。否则,如果 OP 更改了 project
是什么,则没有理由在此处使用 new
。
@johnbakers *project
可以在没有new
的情况下使用,如下所示:Test hoge; Test *project = &hoge;
以上是关于执行字符串分配时 C++ 程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
C++ 程序在执行 con = driver->connect(host, user, pass); 时崩溃且没有错误消息