- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想看看我的所有功能是否正常工作,程序运行到黑屏并关闭,它给我一个错误,三角形内有黄色三角形感叹号,表示
“在 milestone2.exe 0xC0000005 中抛出异常 0x01971FD0 (ucrtbased.dll):访问冲突读取位置 0x0000000”
指示 .cpp 文件的箭头 m_message = new char [strlen(str) + 1 ] 位于 void ErrorMessage::message(const char* str) at
我猜这是某种内存问题,有人知道解决方案吗?
头文件
#ifndef SICT_ERROR_H_
#define SICT_ERROR_H_
namespace sict {
class ErrorMessage {
char* m_message;
public:
ErrorMessage(const char* errorMessage = nullptr);
ErrorMessage(const ErrorMessage& em) = delete;
ErrorMessage& operator=(const ErrorMessage& em) = delete;
virtual ~ErrorMessage();
void clear();
bool isClear() const;
void message(const char* str);
const char* message() const;
};
std::ostream& operator<<(std::ostream& ostr, ErrorMessage);
}
#endif
Cpp文件
#include "ErrorMessage.h"
#include <iostream>
namespace sict {
ErrorMessage::ErrorMessage(const char* errorMessage) {
m_message = nullptr;
message(errorMessage);
}
void ErrorMessage::clear() {
delete[] m_message;
m_message = nullptr;
}
void ErrorMessage::message(const char* str) {
delete[] m_message;
m_message = new char[strlen(str) + 1];
strcpy(m_message, str);
}
const char* ErrorMessage::message() const {
return m_message;
}
ErrorMessage::~ErrorMessage() {
clear();
}
bool ErrorMessage::isClear() const {
if (m_message == nullptr) {
return true;
}
return false;
}
std::ostream& operator<<(std::ostream& ostr, ErrorMessage error) {
if (!(error.isClear())) {
ostr << error.message();
}
return ostr;
}
}
main.cpp
#include <iostream>
#include "ErrorMessage.h"
using namespace std;
using namespace sict;
int main() {
ErrorMessage T("Testing Error Message Module");
ErrorMessage e;
int ret = 0;
bool ok = true;
cout << T << endl << e << endl << "isClear(): " << (e.isClear() ? "Passed!" : "Failed!") << endl;
if (!e.isClear()) ok = false;
cout << endl;
cout << "===========| Long Message\r";
for (int i = 0; i < 10000000; i++) {
if (i % 1000000 == 0) {
cout << "*";
cout.flush();
}
e.message("Some error message that is really long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long"
" long long long long long long long long long long long long long");
}
cout << '*' << endl;
cout << e << endl << "isClear(): " << (e.isClear() ? "Failed!" : "Passed!") << endl;
if (e.isClear()) ok = false;
cout << endl;
e.message("Short Message");
cout << e << endl << e.message() << endl << "isClear(): " << (e.isClear() ? "Failed!" : "Passed!") << endl;
if (e.isClear()) ok = false;
e.clear();
cout << e << endl << "isClear(): " << (e.isClear() ? "Passed!" : "Failed!") << endl;
if (!e.isClear()) ok = false;
cout << endl;
if (ok) {
cout << "You passed all the tests!" << endl;
}
else {
cout << "You did not pass all the tests" << endl;
ret = 1;
}
return ret;
}
最佳答案
在你的 main() 中你有:
ErrorMessage e;
它将使用空指针调用您的构造函数:
ErrorMessage::ErrorMessage(const char* errorMessage) {
m_message = nullptr;
message(errorMessage);
}
然后您的构造函数将调用 message() 并将该空指针传递给它:
void ErrorMessage::message(const char* str) {
delete[] m_message;
m_message = new char[strlen(str) + 1];
strcpy(m_message, str);
}
因此,您正在尝试对空指针执行 strlen()。这就是它给出段错误的原因。
关于c++ - 分配动态内存以存储字符串拷贝时程序中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47645875/
我有一个基类和两个派生类,我需要将一个指向派生类对象的指针复制到另一个类中,就像示例一样。 class Base { public: Base(const Base& other); } cl
考虑 Container 类,它主要存储 Box 对象的 unique_ptr vector ,并可以对它们执行一些计算。 class Container { private: std::
引用是指保存的值为对象的地址。在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些。下面举个例子: 问题描述:已知一个列表,求生成一个
我正在尝试实现 Bron-Kerbosch 算法,这是一种用于查找派系的递归算法。我设法达到了一个点,它返回了正确数量的派系,但是当我打印它们时,它们不正确 - 添加了额外的节点。我在这里遗漏了什么明
在评估中,我选择了选项LINE I 上的运行时错误。没有未定义行为这样的选项,尽管我认为这是正确的选择。 我不确定,但我认为评估有误。我编译并运行了该程序,它确实打印了 3, 9, 0, 2, 1,
在函数签名中通过 const 值传递参数是否有任何好处(或相反,成本)? 所以: void foo( size_t nValue ) { // ... 对比 void foo( const s
我为 answer to another question 写了一个 OutputIterator .在这里: #include using namespace std; template clas
我有一个由第三方生成的 dll,它具有某种内部数据结构,将其大小限制为 X 个元素。 所以基本上,它有一个以 X 为限制的队列。 据我所知,DLL 是每个进程的,但是是否可以多次加载 DLL?也许每个
假设我有以下两个数据结构: std::vector all_items; std::set bad_items; all_items vector 包含所有已知项和 bad_items vector
如何在不渲染 CGImage 的情况下从另一个 CIImage 复制一个 CIImage 最佳答案 CIImage *copiedImage = [originalImage copy]; 正如您在
我有一个名为 UINode 的 GUI,我想创建一个拷贝并只更改一些内容。该项目由 3 个基本线程组成。 PingThread、RosThread 和 GuiThread。我试图复制粘贴项目文件夹并将
Qt 新手。如果这个问题太幼稚,请多多包涵。在 Windows 操作系统环境中,我有 Qt 对话框框架应用程序,它具有“重复”- 按钮。在同一目录中,有 Qt 应用程序 - (一个带有关闭按钮的对话框
我正在尝试创建一个函数来复制我的卡片结构。我只需复制 cvalue 即可轻松开始。然而,我的 cvalue 没有复制,当应该读取 1000 时它仍然读取 5。 #include #include
string str1("someString"); string str2 = string(str1);//how many copies are made here //copy2 =
我希望了解 boost::bind 执行何种函数对象的内部拷贝。由于这些对象的构造函数似乎没有被调用,我推测这是一种“非常浅的复制”,所以我引入了动态内存分配来产生一些错误。但是,下面代码的运行时输出
我正在查看 http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c22-make-default-operations-consis
下面的类方法Augmented3dPoint::getWorldPoint()返回对其成员的引用 cv::Point3f world_point; class Augmented3dPoint { p
我需要通过 MyClass2 将用户定义的 lambda 传递给 MyClass1。我想确保只有一步,没有拷贝。下面的代码实现了吗?有没有更好的方法来做到这一点(比如使用编译器完成的隐式移动)? 注意
在我的数据库访问代码中,我想写一个方法: variant_t GetQueryRows (...) 我想这样调用它: const variant_t result = GetQueryRows (..
我有一个包含引用的类,例如: class A { A(B &b) : b(b) {} // constructor B &b; } 有时b必须是只读的,有时是可写的。当我创建一个 const A
我是一名优秀的程序员,十分优秀!