- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在我的代码中发现了几个无法解决的访问错误。我知道发生内存损坏的行以及解决问题的方法,但是我不明白是什么导致了这些错误。
我使用 DrMemory 检测内存问题,它在第 90、95、105 行指出无法寻址的访问错误。这些行看起来如下:
nodes.at(currNodeId).childrenId.at(QUADRANT::RU) = makeSubtree(pointsByQuadrant.at(QUADRANT::RU),
maxX,
maxY,
minX+(maxX-minX)/2,
minY+(maxY-minY)/2);
哪里nodes
是 vector<QuadTreeNode>
, 字段 children_Id
是array<int32_t,4>
和 makeSubtree
是一个可以将新元素推送到 nodes
的函数 vector 。
错误发生在赋值操作期间。如您所见,我只使用 .at()
访问 vector 和数组中的数据。我的代码没有提示索引超出范围,所以我赋值的元素确实存在。
我觉得这个问题与一个事实有关 makeSubtree
函数将新数据推送到 nodes
这会导致内存重新分配。但是,我无法对这如何导致内存损坏提出合理的解释。因此,我正在寻找对现有 vector 元素的赋值如何导致此类内存损坏的解释。
如果我将上面的代码行重写为
int RU = makeSubtree(pointsByQuadrant.at(QUADRANT::RU),
maxX,
maxY,
minX+(maxX-minX)/2,
minY+(maxY-minY)/2);
nodes.at(currNodeId).childrenId.at(QUADRANT::RU) = RU;
问题消失并且没有发生内存损坏。
完整的代码和 DrMemory 日志附在下面。
代码:
#include <vector>
#include <algorithm>
#include <iostream>
#include <array>
using namespace std;
enum QUADRANT{LU=0,LB=1,RU=2,RB=3};
struct QuadTreeNode{
static int _id;
int id;
QuadTreeNode(){
id = _id++;
cout<<"Node "<<id++<<" made"<<endl;
for(int i=0;i<childrenId.size();i++){
childrenId.at(i)=-1;
}
}
QuadTreeNode(QuadTreeNode const &another){
id = _id++;
cout<<"Node "<<id++<<" copied"<<endl;
for(int i=0;i<childrenId.size();i++){
childrenId.at(i)=another.childrenId.at(i);
}
}
QuadTreeNode(QuadTreeNode &&another){
id = _id++;
cout<<"Node "<<id++<<" moved"<<endl;
for(int i=0;i<childrenId.size();i++){
childrenId.at(i)=another.childrenId.at(i);
}
}
~QuadTreeNode(){
cout<<"Node "<<id<<" destroyed"<<endl;
}
array<int32_t,4> childrenId;
};
int QuadTreeNode::_id=0;
struct QuadTreePointF{
QuadTreePointF(){}
QuadTreePointF(float x, float y): x(x),y(y){}
float x;
float y;
};
class QuadTree
{
public:
//vector<double> points contains x1,y1,x2,y2,..xn,yn coordinates of points
QuadTree(vector<double> points, double maxX, double maxY, double minX, double minY);
vector<QuadTreeNode> nodes;
int rootId;
private:
//Splits points into 4 groups accoring to relative position to center
void splitByQuadrant(const vector<QuadTreePointF> &points, vector<vector<QuadTreePointF>> &pointsByQuadrant, const QuadTreePointF ¢er);
void makeTree(vector<double> points, double maxX, double maxY, double minX, double minY);
int makeSubtree(const vector<QuadTreePointF> &points, double maxX, double maxY, double minX, double minY);
};
QuadTree::QuadTree(vector<double> points, double maxX, double maxY, double minX, double minY)
{
this->makeTree(points,maxX,maxY,minX,minY);
}
void QuadTree::makeTree(vector<double> points, double maxX, double maxY, double minX, double minY)
{
if(points.size() > 0){
nodes.clear();
vector<QuadTreePointF> quadTreePoints(points.size()/2);
for(int i=0;i<points.size();i+=2){
quadTreePoints.at(i/2) = QuadTreePointF(points.at(i),points.at(i+1));
}
rootId = makeSubtree(quadTreePoints,maxX,maxY,minX,minY);
}
}
int QuadTree::makeSubtree(const vector<QuadTreePointF> &points, double maxX, double maxY, double minX, double minY)
{
if(points.size()==0) return -1;
else{
int currNodeId = this->nodes.size();
nodes.push_back(QuadTreeNode());
if(points.size() != 1){
vector<vector<QuadTreePointF>> pointsByQuadrant(4);
splitByQuadrant(points,pointsByQuadrant,QuadTreePointF((maxX+minX)/2,(maxY+minY)/2));
/*line 90*/ nodes.at(currNodeId).childrenId.at(QUADRANT::RU) = makeSubtree(pointsByQuadrant.at(QUADRANT::RU),
maxX,
maxY,
minX+(maxX-minX)/2,
minY+(maxY-minY)/2);
/*line 95*/ nodes.at(currNodeId).childrenId.at(QUADRANT::RB) = makeSubtree(pointsByQuadrant.at(QUADRANT::RB),
maxX,
maxY-(maxY-minY)/2,
minX+(maxX-minX)/2,
minY);
/*line 100*/nodes.at(currNodeId).childrenId.at(QUADRANT::LU) = makeSubtree(pointsByQuadrant.at(QUADRANT::LU),
maxX-(maxX-minX)/2,
maxY,
minX,
minY+(maxY-minY)/2);
/*line 105*/nodes.at(currNodeId).childrenId.at(QUADRANT::LB) = makeSubtree(pointsByQuadrant.at(QUADRANT::LB),
maxX-(maxX-minX)/2,
maxY-(maxY-minY)/2,
minX,
minY);
cout << currNodeId << ": " << nodes.at(currNodeId).childrenId.at(QUADRANT::RU) << " " <<
nodes.at(currNodeId).childrenId.at(QUADRANT::RB) << " " <<
nodes.at(currNodeId).childrenId.at(QUADRANT::LU) << " " <<
nodes.at(currNodeId).childrenId.at(QUADRANT::LB)<<endl;
}
return currNodeId;
}
}
void QuadTree::splitByQuadrant(const vector<QuadTreePointF> &points, vector<vector<QuadTreePointF>> &pointsByQuadrant, const QuadTreePointF ¢er){
for(QuadTreePointF point: points){
if(point.x >= center.x && point.y >= center.y){
pointsByQuadrant.at(QUADRANT::RU).push_back(point);
}else if(point.x >= center.x && point.y < center.y){
pointsByQuadrant.at(QUADRANT::RB).push_back(point);
}else if(point.x < center.x && point.y >= center.y){
pointsByQuadrant.at(QUADRANT::LU).push_back(point);
}else if(point.x < center.x && point.y < center.y){
pointsByQuadrant.at(QUADRANT::LB).push_back(point);
}
}
}
int main(int argc, char *argv[])
{
QuadTree quadTree(vector<double>{100,100, 10,10,78,35,11,11},111,111,0,0);
}
DrMemory 日志:
Dr. Memory version 1.11.0 build 2 built on Aug 29 2016 02:41:18
Dr. Memory results for pid 12996: "StandaloneQuadTree.exe"
Application cmdline: ""D:\Code\Cpp algorithms\build-StandaloneQuadTree-Desktop_Qt_5_12_1_MinGW_64_bit-Debug\debug\StandaloneQuadTree.exe""
Recorded 115 suppression(s) from default D:\Programs\DrMemory-Windows-1.11.0-2\bin64\suppress-default.txt
Error #1: UNADDRESSABLE ACCESS of freed memory: writing 0x0000000002891c0c-0x0000000002891c10 4 byte(s)
# 0 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:90]
# 1 std::vector<>::_M_default_initialize [D:/Programs/Qt5.9/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/stl_vector.h:1347]
# 2 QuadTree::makeTree [../StandaloneQuadTree/main.cpp:76]
# 3 QuadTree::QuadTree [../StandaloneQuadTree/main.cpp:64]
# 4 main [../StandaloneQuadTree/main.cpp:135]
Note: @0:00:00.172 in thread 14268
Note: 0x0000000002891c0c-0x0000000002891c10 overlaps memory 0x0000000002891c00-0x0000000002891c14 that was freed here:
Note: # 0 replace_operator_delete_nothrow [d:\drmemory_package\common\alloc_replace.c:2974]
Note: # 1 msvcrt.dll!isleadbyte_l +0xd1 (0x00007fffb53e3372 <msvcrt.dll+0x3372>)
Note: # 2 libstdc++-6.dll!? +0x0 (0x000000006fcaec18 <libstdc++-6.dll+0x6ec18>)
Note: # 3 libstdc++-6.dll!? +0x0 (0x000000006fcfda9f <libstdc++-6.dll+0xbda9f>)
Note: # 4 libstdc++-6.dll!? +0x0 (0x000000006fcadc82 <libstdc++-6.dll+0x6dc82>)
Note: # 5 QuadTreeNode::~QuadTreeNode [../StandaloneQuadTree/main.cpp:34]
Note: instruction: mov %eax -> (%rbx)
Error #2: UNADDRESSABLE ACCESS of freed memory: writing 0x0000000002891e50-0x0000000002891e54 4 byte(s)
# 0 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:95]
# 1 std::vector<>::_M_default_initialize [D:/Programs/Qt5.9/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/stl_vector.h:1347]
# 2 QuadTree::makeTree [../StandaloneQuadTree/main.cpp:76]
# 3 QuadTree::QuadTree [../StandaloneQuadTree/main.cpp:64]
# 4 main [../StandaloneQuadTree/main.cpp:135]
Note: @0:00:00.188 in thread 14268
Note: 0x0000000002891e50-0x0000000002891e54 overlaps memory 0x0000000002891e40-0x0000000002891e68 that was freed here:
Note: # 0 replace_operator_delete_nothrow [d:\drmemory_package\common\alloc_replace.c:2974]
Note: # 1 msvcrt.dll!isleadbyte_l +0xd1 (0x00007fffb53e3372 <msvcrt.dll+0x3372>)
Note: # 2 libstdc++-6.dll!? +0x0 (0x000000006fcaec18 <libstdc++-6.dll+0x6ec18>)
Note: # 3 libstdc++-6.dll!? +0x0 (0x000000006fcfda9f <libstdc++-6.dll+0xbda9f>)
Note: # 4 libstdc++-6.dll!? +0x0 (0x000000006fcadc82 <libstdc++-6.dll+0x6dc82>)
Note: # 5 QuadTreeNode::~QuadTreeNode [../StandaloneQuadTree/main.cpp:34]
Note: instruction: mov %eax -> (%rbx)
Error #3: UNADDRESSABLE ACCESS of freed memory: writing 0x0000000002892100-0x0000000002892104 4 byte(s)
# 0 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:105]
# 1 QuadTree::splitByQuadrant [../StandaloneQuadTree/main.cpp:120]
# 2 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:90]
# 3 QuadTree::splitByQuadrant [../StandaloneQuadTree/main.cpp:120]
# 4 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:105]
# 5 QuadTree::splitByQuadrant [../StandaloneQuadTree/main.cpp:120]
# 6 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:105]
# 7 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:105]
# 8 std::vector<>::_M_default_initialize [D:/Programs/Qt5.9/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/stl_vector.h:1347]
# 9 QuadTree::makeTree [../StandaloneQuadTree/main.cpp:76]
#10 QuadTree::QuadTree [../StandaloneQuadTree/main.cpp:64]
#11 main [../StandaloneQuadTree/main.cpp:135]
Note: @0:00:00.188 in thread 14268
Note: 0x0000000002892100-0x0000000002892104 overlaps memory 0x0000000002892080-0x0000000002892120 that was freed here:
Note: # 0 replace_operator_delete_nothrow [d:\drmemory_package\common\alloc_replace.c:2974]
Note: # 1 msvcrt.dll!isleadbyte_l +0xd1 (0x00007fffb53e3372 <msvcrt.dll+0x3372>)
Note: # 2 libstdc++-6.dll!? +0x0 (0x000000006fcaec18 <libstdc++-6.dll+0x6ec18>)
Note: # 3 libstdc++-6.dll!? +0x0 (0x000000006fcfda9f <libstdc++-6.dll+0xbda9f>)
Note: # 4 libstdc++-6.dll!? +0x0 (0x000000006fcadc82 <libstdc++-6.dll+0x6dc82>)
Note: # 5 QuadTreeNode::~QuadTreeNode [../StandaloneQuadTree/main.cpp:34]
Note: instruction: mov %eax -> (%rbx)
Error #4: UNADDRESSABLE ACCESS of freed memory: writing 0x00000000028920f0-0x00000000028920f4 4 byte(s)
# 0 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:90]
# 1 QuadTree::splitByQuadrant [../StandaloneQuadTree/main.cpp:120]
# 2 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:105]
# 3 QuadTree::splitByQuadrant [../StandaloneQuadTree/main.cpp:120]
# 4 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:105]
# 5 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:105]
# 6 std::vector<>::_M_default_initialize [D:/Programs/Qt5.9/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/stl_vector.h:1347]
# 7 QuadTree::makeTree [../StandaloneQuadTree/main.cpp:76]
# 8 QuadTree::QuadTree [../StandaloneQuadTree/main.cpp:64]
# 9 main [../StandaloneQuadTree/main.cpp:135]
Note: @0:00:00.204 in thread 14268
Note: 0x00000000028920f0-0x00000000028920f4 overlaps memory 0x0000000002892080-0x0000000002892120 that was freed here:
Note: # 0 replace_operator_delete_nothrow [d:\drmemory_package\common\alloc_replace.c:2974]
Note: # 1 msvcrt.dll!isleadbyte_l +0xd1 (0x00007fffb53e3372 <msvcrt.dll+0x3372>)
Note: # 2 libstdc++-6.dll!? +0x0 (0x000000006fcaec18 <libstdc++-6.dll+0x6ec18>)
Note: # 3 libstdc++-6.dll!? +0x0 (0x000000006fcfda9f <libstdc++-6.dll+0xbda9f>)
Note: # 4 libstdc++-6.dll!? +0x0 (0x000000006fcadc82 <libstdc++-6.dll+0x6dc82>)
Note: # 5 QuadTreeNode::~QuadTreeNode [../StandaloneQuadTree/main.cpp:34]
Note: instruction: mov %eax -> (%rbx)
Error #5: UNADDRESSABLE ACCESS of freed memory: writing 0x00000000028920d8-0x00000000028920dc 4 byte(s)
# 0 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:105]
# 1 QuadTree::splitByQuadrant [../StandaloneQuadTree/main.cpp:120]
# 2 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:105]
# 3 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:105]
# 4 std::vector<>::_M_default_initialize [D:/Programs/Qt5.9/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/stl_vector.h:1347]
# 5 QuadTree::makeTree [../StandaloneQuadTree/main.cpp:76]
# 6 QuadTree::QuadTree [../StandaloneQuadTree/main.cpp:64]
# 7 main [../StandaloneQuadTree/main.cpp:135]
Note: @0:00:00.204 in thread 14268
Note: 0x00000000028920d8-0x00000000028920dc overlaps memory 0x0000000002892080-0x0000000002892120 that was freed here:
Note: # 0 replace_operator_delete_nothrow [d:\drmemory_package\common\alloc_replace.c:2974]
Note: # 1 msvcrt.dll!isleadbyte_l +0xd1 (0x00007fffb53e3372 <msvcrt.dll+0x3372>)
Note: # 2 libstdc++-6.dll!? +0x0 (0x000000006fcaec18 <libstdc++-6.dll+0x6ec18>)
Note: # 3 libstdc++-6.dll!? +0x0 (0x000000006fcfda9f <libstdc++-6.dll+0xbda9f>)
Note: # 4 libstdc++-6.dll!? +0x0 (0x000000006fcadc82 <libstdc++-6.dll+0x6dc82>)
Note: # 5 QuadTreeNode::~QuadTreeNode [../StandaloneQuadTree/main.cpp:34]
Note: instruction: mov %eax -> (%rbx)
Error #6: UNADDRESSABLE ACCESS of freed memory: writing 0x0000000002891ef4-0x0000000002891ef8 4 byte(s)
# 0 QuadTree::makeSubtree [../StandaloneQuadTree/main.cpp:105]
# 1 std::vector<>::_M_default_initialize [D:/Programs/Qt5.9/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/bits/stl_vector.h:1347]
# 2 QuadTree::makeTree [../StandaloneQuadTree/main.cpp:76]
# 3 QuadTree::QuadTree [../StandaloneQuadTree/main.cpp:64]
# 4 main [../StandaloneQuadTree/main.cpp:135]
Note: @0:00:00.204 in thread 14268
Note: 0x0000000002891ef4-0x0000000002891ef8 overlaps memory 0x0000000002891eb0-0x0000000002891f00 that was freed here:
Note: # 0 replace_operator_delete_nothrow [d:\drmemory_package\common\alloc_replace.c:2974]
Note: # 1 msvcrt.dll!isleadbyte_l +0xd1 (0x00007fffb53e3372 <msvcrt.dll+0x3372>)
Note: # 2 libstdc++-6.dll!? +0x0 (0x000000006fcaec18 <libstdc++-6.dll+0x6ec18>)
Note: # 3 libstdc++-6.dll!? +0x0 (0x000000006fcfda9f <libstdc++-6.dll+0xbda9f>)
Note: # 4 libstdc++-6.dll!? +0x0 (0x000000006fcadc82 <libstdc++-6.dll+0x6dc82>)
Note: # 5 QuadTreeNode::~QuadTreeNode [../StandaloneQuadTree/main.cpp:34]
Note: instruction: mov %eax -> (%rbx)
Error #7: POSSIBLE LEAK 131 direct bytes 0x00000000028901e0-0x0000000002890263 + 0 indirect bytes
# 0 replace_malloc [d:\drmemory_package\common\alloc_replace.c:2576]
# 1 ntdll.dll!RtlCopyUnicodeString +0x45 (0x00007fffb58c382a <ntdll.dll+0x2382a>)
# 2 ntdll.dll!LdrGetDllFullName +0x52 (0x00007fffb58bffeb <ntdll.dll+0x1ffeb>)
# 3 pre_cpp_init
# 4 msvcrt.dll!initterm +0x1e (0x00007fffb53e5d53 <msvcrt.dll+0x5d53>)
# 5 __tmainCRTStartup
# 6 .l_start
# 7 KERNEL32.dll!BaseThreadInitThunk +0xc (0x00007fffb39816ad <KERNEL32.dll+0x16ad>)
===========================================================================
FINAL SUMMARY:
DUPLICATE ERROR COUNTS:
Error # 6: 2
SUPPRESSIONS USED:
ERRORS FOUND:
6 unique, 7 total unaddressable access(es)
0 unique, 0 total invalid heap argument(s)
0 unique, 0 total GDI usage error(s)
0 unique, 0 total handle leak(s)
0 unique, 0 total warning(s)
0 unique, 0 total, 0 byte(s) of leak(s)
1 unique, 1 total, 131 byte(s) of possible leak(s)
ERRORS IGNORED:
2 potential error(s) (suspected false positives)
(details: D:\Programs\DrMemory-Windows-1.11.0-2\drmemory\logs\DrMemory-StandaloneQuadTree.exe.12996.000\potential_errors.txt)
7 unique, 7 total, 5002 byte(s) of still-reachable allocation(s)
(re-run with "-show_reachable" for details)
Details: D:\Programs\DrMemory-Windows-1.11.0-2\drmemory\logs\DrMemory-StandaloneQuadTree.exe.12996.000\results.txt
最佳答案
在您已经进行了所有调查之后,看起来真的很容易理解。
如果调整 vector 的大小,则内存会重新定位,并且您正在访问分配时已经释放的内存。
//this is essentially the left side in your original code
int32_t* leftSide = &(nodes.at(currNodeId).childrenId.at(QUADRANT::RU));
int RU = makeSubtree(pointsByQuadrant.at(QUADRANT::RU),
maxX,
maxY,
minX+(maxX-minX)/2,
minY+(maxY-minY)/2);
//this is the left side as it should be
int32_t* leftSide2 = &(nodes.at(currNodeId).childrenId.at(QUADRANT::RU));
assert(leftSide2 == leftSide); //this will fail if the vector resizes
顺便说一句,我不确定这种失败现在是否符合标准,因为 the C++17 Standard introduced this rule :
In every simple assignment expression E1=E2 and every compound assignment expression E1@=E2, every value computation and side-effect of E2 is sequenced before every value computation and side effect of E1
关于c++ - 对 std::vector 元素的赋值导致内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54722904/
在开发中的网页上,我在 IE 上遇到此错误 element = $(element); 此代码位于prototype.js 预期对象 如何消除此错误。 更新: 现场也使用了 jQuery。 最佳答
我有两个大小相同的嵌套数组: Array1 =[[1, 2], [], [2, 3]] Array2= [[1, 4], [8, 11], [3, 6]] 我需要将它们合并到一个数组中,如下所示: A
我有一些 jQuery 代码,当单击具有特定 ID 的项目时运行。当 ID 是 的一部分时,它就可以工作。元素,但当它位于 中时则不然元素。为什么会这样呢?我想使用 an,因为如果用户关闭了 Ja
Flex-box 规范 3声明 flex 元素不是 block 容器: A flex item establishes a new formatting context for its content
我遇到了一个意想不到的问题。 HTML JS $(function() { var $divs = $('.myDiv'); // create new div not in
我使用 Bootstrap 和 Ember.js 得到了一个无序列表。每个列表项都是一个显示新帖子的链接,每当您单击该链接时,Ember 都会添加类 active默认情况下。我正在使用 Bootstr
我正在尝试让一个函数正常工作,但运气不佳,所以我想向 Stackoverflow 智囊团提出一个新手问题! 基本上,我有一个表单,并且循环遍历所有元素以查看是否存在自定义数据属性。如果存在,则保持该元
我想映射一个可选数组,删除那些 nil 值,并使用另一个函数映射非 nil 值。 我知道我可以通过使用 compactMap 然后使用常规 map 来实现这一点,但我只想遍历数组一次。 我为此实现了一
我如何定位 li 元素,除非它们出现在 之后元素?换句话说,我想针对步骤而不是注释。 我尝试向 OL 添加一个我想从选择中排除的类,但我想出的代码不起作用。 (顺便说一句,重构 html 不是一种选
Warning 1 The element 'system.webServer' has invalid child element 'rewrite'. List of possible eleme
我正在尝试编写一个脚本,该脚本将遍历 HTML 源并创建 DOM 的 JSON 文件,然后使用 d3.js 在 TreeView 中显示该文件。我遇到的问题是不仅希望显示元素(TITLE、P、LI 等
我有以下 HTML 表单:- Option 1 Option 2
我试图在选定的 HTML 元素之后选择下一个具有类名 slider-value 的 span 元素。我尝试了多种解决方案,但没有一个有效。 我可以通过 id 选择它,但我不希望那样做使代码冗余。 $(
如果电子邮件地址无效,我想在屏幕上显示一条消息“请输入有效的电子邮件地址”。 body 元素的innerHTML 语句工作正常,但我用于p 元素的innerHTML 语句不起作用。 有一次,当我测试它
以下 jQuery 代码调用 ul 元素,查找元素内的前 三个 li 列表项,并隐藏剩余的 li 项目。然后,它附加一个 li 元素,其中显示“显示更多...”,并且在单击时显示之前隐藏的列表项。 (
我问了a question早些时候关于将编辑/删除链接与 h1 元素内联的最佳方法。我能够通过给出的答案实现这一点,但我现在有额外的要求,我需要在 h1 下方显示一个段落并编辑/删除链接。 到目前为止
我使用 MVC 4 和 knockout.js 库版本 2.1.0 显示从服务器检索到的大量文件的表中的以下摘录。 0)"> 正在正确检索数据,
我创建了一个脚本,该脚本在鼠标悬停在父容器上时激活,并且应该将其子元素移离鼠标。我目前已经让它工作了,但是代码的某些部分似乎与 REACT 代码应该是什么样子相矛盾。特别是两个部分。 我在渲染函数中使
我是 JS 新手,正在尝试理解项目 https://github.com/tastejs/todomvc 的代码 请参阅屏幕截图,我尝试对 button X 以及其父元素 div 设置断点,但在这两种
例如,假设有一个带有奇特颜色的标记: Something written here 使用 Visual Studio 2017 和 MVC 5 元素,有没有办法检查和定位当前应用了哪些样式,以及负责它
我是一名优秀的程序员,十分优秀!