执行字符串分配时 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;

ma​​in.cpp

#include "test.h"
int main(int argc, char* argv[]) 
    Test* project;
    project->addName("abc");
    return 0;

结果:

abc

程序意外结束。

【问题讨论】:

为什么将project 声明为指针?我建议您摆脱它作为指针,将-&gt;更改为.后代码应该可以正常工作。 与您的问题完全无关,但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 = &amp;hoge;

以上是关于执行字符串分配时 C++ 程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为太多动态分配的数组赋值时程序崩溃 - C++

当内存不足时,c ++分配器使应用程序崩溃[重复]

当我溢出分配的字符数组时,为啥我的 C 程序不会崩溃?

C++学习39 异常处理入门(try和catch)

C++ 程序在执行 con = driver->connect(host, user, pass); 时崩溃且没有错误消息

C++ 中的崩溃恢复