C++赋值构造函数瓦尔格林德错误
C++ Assignment Constructor Valgrind Errors
我正在尝试创建自己的向量用于练习目的。一切都很顺利,但现在我想测试包含分配内存的对象的向量。
我的问题在于该类 (1) 的赋值构造函数,该构造函数在测试向量的构造函数中调用。
test_vec.h:
#ifndef TEST_VEC
#define TEST_VEC
#include <cstddef>
template<class T>
class vector
{
public:
explicit vector(size_t count, const T& value)
: m_size(count)
, m_capacity(count)
, raw_data(static_cast<T*>(operator new(count * sizeof(T))))
{
for (size_t i = 0; i < count; ++i) {
raw_data[i] = value; //(1) Calls the assignment constructor
}
}
~vector()
{
//clearing objects not implemented yet
operator delete(raw_data);
}
private:
size_t m_size;
size_t m_capacity;
T* raw_data;
};
#endif
主.cpp:
#include "test_vec.h"
class TestClass {
public:
TestClass(size_t number) {
testMem = new size_t[10];
for (size_t i = 0; i < 10; ++i) {
testMem[i] = 0;
}
testMem[1] = number;
}
TestClass(const TestClass& other) {
testMem = new size_t[10];
for (size_t i = 0; i < 10; ++i) {
testMem[i] = other.testMem[i];
}
}
TestClass& operator=(const TestClass& other) {
if (this != &other) {
//I know this is not exception safe at the moment
delete[] testMem; //(2) delete earlier assigned memory
testMem = new size_t[10];
for (size_t i = 0; i < 10; ++i) {
testMem[i] = other.testMem[i];
}
}
return *this;
}
~TestClass() {
delete[] testMem;
}
size_t number() const {
return testMem[1];
}
private:
size_t* testMem = NULL;
};
int main() {
TestClass t1(4); //(4)
TestClass t2(3);
t1 = t2;
vector<TestClass> vec_TestClass(1, TestClass(3)); //(3)
}
一切都很顺利。但是valgrind在(3)处抱怨"条件跳转或移动取决于未初始化的值"。这是正确的,因为在我想要分配对象的那一刻,testMem 没有初始化。但是当我评论删除 (2) 时,我从 (4) 中得到内存泄漏。这也是正确的。
我该如何解决这个问题,以便两种情况都得到处理?
感谢和问候
没有"赋值构造函数"这样的东西。我知道您可能想弄乱未初始化的内存,但您仍然需要调用适当的构造函数。在您的情况下,最简单的方法是使用std:::uninitialised_fill_n
#include <memory>
explicit vector(size_t count, const T& value)
: m_size(count)
, m_capacity(count)
, raw_data(static_cast<T*>(operator new(count * sizeof(T))))
{
std::uninitiliased_fill_n(raw_data, count, value);
}
另请注意,矢量析构函数还需要销毁它构造的任何对象。
为什么这static_cast<T*>(operator new(count * sizeof(T)))
而不是一个合适的new T[count]
?你从来没有真正创造过任何T
! TestClass
也不是微不足道的,所以它确实需要构建。瓦尔格林德似乎知道这一点。
operator new
和operator delete
适用于分配器,不适用于用户。它们只创建一个内存块,没有对象。使用 new
和 delete
(或者在实际代码中,使用标准容器!
此外,您的vector
类没有复制构造函数。因此,vector
的任何副本都有一个未初始化的、无效的raw_data
成员指针。这在您的测试用例中不是问题,但通常是问题。
此外,没有赋值构造函数这样的东西。要么你建造,要么你分配!
好的。我认为它被称为赋值运算符。错误是 TestClass 没有默认构造函数。我解决了这个问题,一切都很顺利。我用 rihgt 函数替换了新运算符和删除运算符。我为这个小例子剥离了我的向量。复制构造函数也是。
谢谢。我需要默认构造函数的提示是解决方案。
- 删除堆后对瓦尔格林德错误感到困惑
- 瓦尔格林德报告在 =带有嵌套shared_ptrs的运算符上的读取错误
- 瓦尔格林德错误 - 地址0x0不是堆叠的 malloc'd 或自由的
- 瓦尔格林德错误来自 boost::asio
- 修复了瓦尔格林德错误内存泄漏的错误
- 3D 阵列中的瓦尔格林德错误C++
- 访问字符串::c_str()的结果时出现瓦尔格林德内存访问错误
- 段错误,但不是在瓦尔格林德或GDB中
- 我应该如何修复瓦尔格林德的未初始化值错误?
- 二叉搜索树瓦尔格林德错误"Invalid read of size 8"
- C++赋值构造函数瓦尔格林德错误
- 为什么我会遇到分段错误?瓦尔格林德
- 瓦尔格林德无效读取大小 4 错误
- C++内存泄漏检查中的瓦尔格林德错误
- 有人可以用打开的 mpi 解释这个瓦尔格林德错误吗?
- 瓦尔格林德错误"Invalid read of size 4"
- 为什么瓦尔格林德会给出"Invalid read of size 1"错误?
- C++瓦尔格林德错误
- 瓦尔格林德 - 错误
- 瓦尔格林德错误,未初始化的值