- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题是:
Error in `./runTests': free(): invalid pointer: 0x00007fdb92fe27a0 Aborted
测试套件是:
#include "serial/BufferWrapper.h"
#include <iostream>
#include <memory>
#include <gtest/gtest.h>
#define STREAM_LEN 128
using namespace std;
namespace {
// The fixture for testing class BufferWrapperTest.
class BufferWrapperTest : public ::testing::Test
{
public:
// Objects declared here can be used by all tests.
unique_ptr<serial::BufferWrapper> bw;
BufferWrapperTest() :
bw((unique_ptr<serial::BufferWrapper>) new serial::BufferWrapper())
{}
//virtual ~BufferWrapperTest(){}
// If the constructor and destructor are not enough for setting up
// and cleaning up each test, you can define the following methods:
//virtual void SetUp() {
// Code here will be called immediately after the constructor (right
// before each test).
//}
//virtual void TearDown() {
// Code here will be called immediately after each test (right
// before the destructor).
//}
}; // BufferWrapperTest
/*! tests that checksum works in buffer wrapper */
TEST_F(BufferWrapperTest, CheckSum) {
std::vector<unsigned char> test_vec;
test_vec.push_back('0'); // us1
test_vec.push_back('0'); // us2
test_vec.push_back('0'); // ir1
test_vec.push_back('0'); // ir2
test_vec.push_back('0'); // ir3
test_vec.push_back('0'); // wheel
test_vec.push_back('0'); // dis1
test_vec.push_back('0'); // dis2
test_vec.push_back('0'); // dis3
test_vec.push_back('0'); // dis4
test_vec.push_back('0'); // light
ASSERT_EQ((unsigned char) 48, bw->checksum(test_vec));
// clear after first test
test_vec.clear();
test_vec.push_back('2'); // us1
test_vec.push_back('3'); // us2
test_vec.push_back('4'); // ir1
test_vec.push_back('5'); // ir2
test_vec.push_back('6'); // ir3
test_vec.push_back('0'); // wheel
test_vec.push_back('0'); // dis1
test_vec.push_back('0'); // dis2
test_vec.push_back('0'); // dis3
test_vec.push_back('0'); // dis4
test_vec.push_back('0'); // light
ASSERT_EQ((unsigned char) 54, bw->checksum(test_vec));
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
函数校验和
是:
unsigned char serial::BufferWrapper::checksum(const std::vector<unsigned char> pkt)
{
unsigned char chksum = 0;
if (pkt.size() == 0) return chksum;
for (auto it = pkt.begin(); it != pkt.end(); ++it) {
// the checksum is calculated by XOR all elements
chksum = (unsigned char)(chksum ^ *it);
}
return chksum;
}
编辑*:添加了serial::BufferWrapper
#include <iostream>
#include <iomanip>
#include <mutex>
#include <algorithm>
#include "serial/BufferWrapper.h"
#include "containerfactory/SBDContainer.h"
using namespace std;
// append receive buffer mutex
std::mutex arb;
// append send buffer mutex
std::mutex asb;
// read send buffer mutex
std::mutex rsm;
// read receive buffer mutex
std::mutex rrm;
/*! constructor */
serial::BufferWrapper::BufferWrapper() : buffer_in({}), buffer_out({})
{
cout << "creating buffer wrapper... ";
cout << "[OK]" << endl;
}
/*! destructor */
serial::BufferWrapper::~BufferWrapper()
{
cout << "destroying buffer wrapper... ";
cout << "[OK]" << endl;
}
/*! appends a correct packet to the receive buffer */
void serial::BufferWrapper::appendReceiveBuffer(vector<unsigned char> data)
{
// lock mutex
arb.lock();
// return if the length of the vedcor is too short
if (data.size() < SBDPKTSIZE) {
// unlock mutex
arb.unlock();
return;
}
// the vector to hold the correct packet
vector<unsigned char> valid_pkt;
// loop through the received data from the read and look
// for a correct packet
for (auto it = data.begin(); it != data.end(); it++) {
if (it + SBDPKTSIZE > data.end()) {
break;
}
if (*it == DEL_ONE && *(it+DEL_TWO_POS) == DEL_TWO &&
*(it+DEL_DBCOLON_POS) == DEL_DBCOLON && *(it+DEL_COMMA_POS) == DEL_COMMA) {
unsigned char us1 = *(it+US1_POS);
//printf("US1:%i ", us1);
unsigned char us2 = *(it+US2_POS);
//printf("US2:%i ", us2);
unsigned char ir1 = *(it+IR1_POS);
//printf("IR1:%i ", ir1);
unsigned char ir2 = *(it+IR2_POS);
//printf("IR2:%i ", ir2);
unsigned char ir3 = *(it+IR3_POS);
//printf("IR3:%i ", ir3);
unsigned char wheel = *(it+WHL_POS);
//printf("WHEEL:%i ", wheel);
unsigned char dis1 = *(it+DIS_POS_1);
//printf("DIS1:%i ", dis1);
unsigned char dis2 = *(it+DIS_POS_2);
//printf("DIS2:%i ", dis2);
unsigned char dis3 = *(it+DIS_POS_3);
//printf("DIS3:%i ", dis3);
unsigned char dis4 = *(it+DIS_POS_4);
//printf("DIS4:%i ", dis4);
unsigned char light = *(it+LIGHT_SEN);
//printf("LIGHT:%i ", light);
unsigned char check = *(it+CHK_SUM);
//printf("CHECK:%i\n", check);
// fill the vector
valid_pkt = {us1, us2, ir1, ir2, ir3, wheel, dis1, dis2, dis3, dis4, light};
// check if correct checksum
if (check == checksum(valid_pkt)) {
cout << "checksum OK" << endl;
break;
}
else {
cout << "checksum FAIL" << endl;
// clear the return vector
valid_pkt.clear();
// find where next packet starts
it = find(it+1, data.end(), DEL_ONE);
// if not found, break
if (it == data.end()) break;
}
}
}
// push in front of the buffer if valid data
if (valid_pkt.size() != 0) {
buffer_in.push_front(valid_pkt);
}
// unlock mutex
arb.unlock();
}
/*! returns the most recent valid packet from the read buffer */
vector<unsigned char> serial::BufferWrapper::readReceiveBuffer(void)
{
rrm.lock();
// check for size, i.e. not empty
if(buffer_in.size() != 0)
{
// get 3the most recent packet, always in first position
std::vector<unsigned char> vec = buffer_in.at(0);
// clear the buffer
buffer_in.clear();
rrm.unlock();
return vec;
}
else
{
rrm.unlock();
return {};
}
}
/*! appends a correct packet to the send buffer */
void serial::BufferWrapper::appendSendBuffer(vector<unsigned char> vec)
{
// lock mutex
asb.lock();
buffer_out.push_front(vec);
// and unlock after append
asb.unlock();
}
/*! returns the most recent valid packet from the send buffer */
vector<unsigned char> serial::BufferWrapper::readSendBuffer(void)
{
rsm.lock();
// check for size, i.e. not empty
if(buffer_out.size() != 0)
{
// get the most recent packet, always in first position
vector<unsigned char> v = buffer_out.at(0);
// clear the buffer
buffer_out.clear();
rsm.unlock();
return v;
}
else
{
rsm.unlock();
return {};
}
}
/*! calculates and returns the checksum for a valid packet */
unsigned char serial::BufferWrapper::checksum(const std::vector<unsigned char> pkt)
{
unsigned char chksum = 0;
if (pkt.size() == 0) return chksum;
for (auto it = pkt.begin(); it != pkt.end(); ++it) {
// the checksum is calculated by XOR all elements
chksum = (unsigned char)(chksum ^ *it);
}
return chksum;
}
编辑* 添加声明:
namespace serial
{
class BufferWrapper
{
public:
/*! constructor */
BufferWrapper();
/*! destructor */
~BufferWrapper();
/*! appends data read from the serial to the receive buffer */
void appendReceiveBuffer(std::vector<unsigned char>);
/*! returns a valid packet from the receive buffer */
std::vector<unsigned char> readReceiveBuffer(void);
/*! appends to the send buffer data to write to the serial */
void appendSendBuffer(std::vector<unsigned char>);
/*! returns a valid packet to write to the serial */
std::vector<unsigned char> readSendBuffer(void);
/*! returns the checksum for a valid packet */
unsigned char checksum(const std::vector<unsigned char>);
private:
/*! the receive buffer */
std::deque<std::vector<unsigned char>> buffer_in;
/*! the send buffer */
std::deque<std::vector<unsigned char>> buffer_out;
};
}
运行测试的完整打印输出是:
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from BufferWrapperTest
[ RUN ] BufferWrapperTest.CheckSum
creating buffer wrapper... [OK]
destroying buffer wrapper... [OK]
[ OK ] BufferWrapperTest.CheckSum (1 ms)
[----------] 1 test from BufferWrapperTest (1 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (1 ms total)
[ PASSED ] 1 test.
*** Error in `./runTests': free(): invalid pointer: 0x00007fdb92fe27a0 ***
Aborted
为什么当测试运行并完成并且创建和销毁测试套件中的指针时会发生这种情况?
最佳答案
我敢打赌问题出在这个初始化上:
bw((unique_ptr<serial::BufferWrapper>) new serial::BufferWrapper())
这里你分配一个serial::BufferWrapper
对象,然后将指针指向 std::unique_ptr<...>
object,这意味着编译器将调用 std::unique_ptr<...>
运动 constructor .应调用的构造函数应该是采用指向包装类型的指针的构造函数。
所以要解决这个问题,只需跳过转换并执行
bw(new serial::BufferWrapper)
这里的教训?永远不要永远在 C++ 中使用 C 风格的转换。
关于c++ - 运行 GTest 时指针无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37003246/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我在64位linux下使用c++,编译器(g++)也是64位的。当我打印某个变量的地址时,例如一个整数,它应该打印一个 64 位整数,但实际上它打印了一个 48 位整数。 int i; cout <<
我是一名优秀的程序员,十分优秀!